0
我有一个奇怪的问题。我一直在使用robopsice工作一个月左右,工作得很好,但今天午餐回来后,我的SpiceRequest的loadDataFromNetwork停止了调用。我认为这不是应用程序代码的问题,但我不确定是否需要查看。我的SQL API运行良好,并在浏览器中工作。下面是我得到的错误,SpiceRequest和活动称之为:Robospice loadDataFromNetwork()not firing
01-10 01:04:22.873: D//SpiceManager.java:281(2241): 01:04:22.873 SpiceManagerThread 0 Sending request to service : CachedSpiceRequest
01-10 01:04:22.874: D//RequestProcessor.java:66(2241): 01:04:22.874 SpiceManagerThread 0 Adding request to queue 151426252: CachedSpiceRequest [[email protected], cacheDuration=60000, [email protected]] size is 0
01-10 01:04:22.874: D//RequestProcessor.java:85(2241): 01:04:22.874 SpiceManagerThread 0 Adding entry for type class com.example.model.UserSession and cacheKey [email protected]
01-10 01:04:22.875: D//RequestProgressManager.java:61(2241): 01:04:22.875 SpiceManagerThread 0 Request was added to queue.
01-10 01:04:22.875: D//SpiceServiceListenerNotifier.java:146(2241): 01:04:22.875 SpiceManagerThread 0 Message queue is Handler (android.os.Handler) {2234a2ce}
01-10 01:04:22.875: D//RequestProgressManager.java:82(2241): 01:04:22.875 SpiceManagerThread 0 Sending progress PENDING
01-10 01:04:22.876: D//SpiceServiceListenerNotifier.java:146(2241): 01:04:22.876 SpiceManagerThread 0 Message queue is Handler (android.os.Handler) {2234a2ce}
01-10 01:04:22.876: D//SpiceServiceListenerNotifier.java:175(2241): 01:04:22.876 main Processing request added: CachedSpiceRequest [[email protected], cacheDuration=60000, [email protected]]
01-10 01:04:22.877: V//SpiceService.java:442(2241): 01:04:22.877 SpiceManagerThread 0 Pending requests : 1
01-10 01:04:22.881: V//SpiceService.java:444(2241): 01:04:22.881 SpiceManagerThread 0 Stop foreground
01-10 01:04:22.883: D//DefaultRequestRunner.java:83(2241): 01:04:22.882 Thread-222 Processing request : CachedSpiceRequest [[email protected], cacheDuration=60000, [email protected]]
01-10 01:04:22.883: D//DefaultRequestRunner.java:97(2241): 01:04:22.883 Thread-222 Loading request from cache : CachedSpiceRequest [[email protected], cacheDuration=60000, [email protected]]
01-10 01:04:22.883: D//RequestProgressManager.java:82(2241): 01:04:22.883 Thread-222 Sending progress READING_FROM_CACHE
01-10 01:04:22.884: D//SpiceServiceListenerNotifier.java:146(2241): 01:04:22.884 Thread-222 Message queue is Handler (android.os.Handler) {2234a2ce}
01-10 01:04:22.885: D//DefaultRequestRunner.java:129(2241): 01:04:22.885 Thread-222 Cache content not available or expired or disabled
01-10 01:04:22.886: E//DefaultRequestRunner.java:131(2241): 01:04:22.886 Thread-222 Network is down.
01-10 01:04:22.887: D//DefaultRequestRunner.java:294(2241): 01:04:22.887 Thread-222 It tooks 04 ms to process request CachedSpiceRequest [[email protected], cacheDuration=60000, [email protected]].
我SpiceRequest类
public class SessionRequest extends SpringAndroidSpiceRequest<UserSession>
{
public enum OPERATION {LOGIN,LOGOUT,SIGNUP};
private User user = new User();
private boolean operation;
private String token;
OPERATION op = null;
Session toSend = new Session();
Config config = new Config();
public SessionRequest(Session s,String tok, OPERATION op)
{
super(UserSession.class);
toSend = s;
this.token = tok;
this.op = op;
}
@Override
public UserSession loadDataFromNetwork() throws Exception
{
HttpHeaders headers = new HttpHeaders();
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
ResponseEntity<UserSession> response = null;
HttpEntity<?> postEntity;
switch(op)
{
case SIGNUP:
try{
User send = new User();
send.setUsername(toSend.getEmail());
send.setPassword(toSend.getPassword());
send.setPasswordConfirmation(toSend.getPasswordConfirmation());
restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
//MultiValueMap<String, User> body = new LinkedMultiValueMap<String, User>();
//body.add("user", send);
postEntity = new HttpEntity<Object>(send,headers);
Log.i("Request", new Gson().toJson(postEntity.getBody()));
response = restTemplate.exchange(config.WEB_SERVICE_URL + "https://stackoverflow.com/users/", HttpMethod.POST,postEntity,UserSession.class);
Log.i("Response", new Gson().toJson(response));
}
catch (RestClientException e) {
Log.d("REST", ((HttpStatusCodeException)e).getResponseBodyAsString());
}
break;
case LOGIN:
restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
postEntity = new HttpEntity<Object>(toSend,headers);
response = restTemplate.exchange(config.WEB_SERVICE_URL + "/sessions/", HttpMethod.POST,postEntity,UserSession.class);
Log.d("Response", new Gson().toJson(response));
break;
case LOGOUT:
headers.add("Authorization", "Token token=" +token);
restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
HttpEntity<?> deleteEntity = new HttpEntity<Object>(headers);
response = restTemplate.exchange(config.WEB_SERVICE_URL+ "sessions/" + token, HttpMethod.DELETE,deleteEntity,UserSession.class);
return(null);
}
UserSession resp = response.getBody();
Log.d("request","connected");
return (resp);
}
/**
* This method generates a unique cache key for this request. In this case
* our cache key depends just on the keyword.
* @return
*/
public String createCacheKey() {
return "followers." + user;
}
}
从活动执行请求的块:
private void performRequest()
{
SessionRequest request = new SessionRequest (getCurrentSession(),"",SessionRequest.OPERATION.LOGIN);
lastRequestCacheKey = request.createCacheKey();
spiceManager.execute(request, lastRequestCacheKey, DurationInMillis.ONE_MINUTE, new UserRequestListener());
}
public void callPerformRequest(){
performRequest();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState.containsKey(KEY_LAST_REQUEST_CACHE_KEY)) {
lastRequestCacheKey = savedInstanceState
.getString(KEY_LAST_REQUEST_CACHE_KEY);
spiceManager.addListenerIfPending(UserSession.class,
lastRequestCacheKey, new UserRequestListener());
spiceManager.getFromCache(UserSession.class,
lastRequestCacheKey, DurationInMillis.ONE_MINUTE,
new UserRequestListener());
}
}
private class UserRequestListener implements RequestListener <UserSession>
{
@Override
public void onRequestFailure(SpiceException e)
{
TextView error = (TextView) findViewById(R.id.errorText);
error.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/MYRIADPRO-REGULAR.OTF"));
error.setText("Invalid Username or Password");
}
@Override
public void onRequestSuccess (UserSession returnedSession)
{
if (returnedSession == null)
{
return;
}
returnedSession.getUser().setToken(returnedSession.getSession().getAuthToken());
Bundle b = new Bundle();
b.putParcelable("user", returnedSession.getUser());
Intent i = new Intent (MainActivity.this,Dashboard.class);
i.putExtras(b);
startActivity(i);
}
}
}
从调试我可以看到我们构造的请求和执行调用是到达但loadDataFromNetwork()方法不会触发,并在一会儿之后,它会去onRequestFailure。这可能是我的RoboSpice jar的问题吗?这真的很奇怪,它会突然停止工作。我什至尝试重新启动我的电脑。我唯一能想到的其他事情可能是缓存以某种方式阻止它。任何帮助表示赞赏!
感谢