我有一个奇怪的问题。我一直在使用robopsice一个月左右,它工作得很好,但今天从午餐回来后,我的SpiceRequest的loadDataFromNetwork停止了调用。我不认为这是应用程序代码的问题,但我不确定还有其他问题。我的sql api运行正常,可以在浏览器中运行。这是我得到的错误,SpiceRequest和调用它的活动:
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 [requestCacheKey=followers.com.example.model.User@1f0803c, cacheDuration=60000, spiceRequest=com.example.jobpool.SessionRequest@3aebb315] 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 followers.com.example.model.User@1f0803c.
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 [requestCacheKey=followers.com.example.model.User@1f0803c, cacheDuration=60000, spiceRequest=com.example.jobpool.SessionRequest@3aebb315]
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 [requestCacheKey=followers.com.example.model.User@1f0803c, cacheDuration=60000, spiceRequest=com.example.jobpool.SessionRequest@3aebb315]
01-10 01:04:22.883: D//DefaultRequestRunner.java:97(2241): 01:04:22.883 Thread-222 Loading request from cache : CachedSpiceRequest [requestCacheKey=followers.com.example.model.User@1f0803c, cacheDuration=60000, spiceRequest=com.example.jobpool.SessionRequest@3aebb315]
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 [requestCacheKey=followers.com.example.model.User@1f0803c, cacheDuration=60000, spiceRequest=com.example.jobpool.SessionRequest@3aebb315].
My 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 + "/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的问题吗?它真的很奇怪它会突然停止工作。我甚至试过重启我的电脑。我能想到的唯一另一件事就是缓存可能会以某种方式阻止它。任何帮助表示赞赏!
感谢
答案 0 :(得分:1)
你的日志说
01-10 01:04:22.886: E//DefaultRequestRunner.java:131(2241): 01:04:22.886 Thread-222 Network is down.
检查您的设备是否在线。