我有一个改装界面,用于定义带回调的方法,如下所示:
public interface ApiManagerService {
@GET("/users/")
void getUsers(Callback<List<GitHubMember>>);
}
GitHubMember
只是一个包含3个字段的POJO:id,login和url。我创建了一个名为ResponseHandler的类,我可以在其中包装来自Callback的响应。这是如何定义的:
public class ResponseHandler<T> {
private T response;
private RESPONSE_CODE responseCode;
private String detail;
public static enum RESPONSE_CODE {
OK, // if request suceed
APP_ERROR, //technical error for instance network
TECHNICAL_ERROR // app technical error
}
//getters and setters
以下是我使用getUsers方法使用此类的方法:
public ResponseHandler<List<GitHubMember>> getUsers() {
ResponseHandler<List<GitHubMember>> handler = new ResponseHandler<List<GitHubMember>>();
apiManagerService.getUsers(new Callback<List<GitHubMember>> cb) {
@Override
public void success(List<GitHubMember> users, Response response) {
responseHandler.setResponse(users);
responseHandler.setResponseCode(ResponseHandler.RESPONSE_CODE.OK);
}
@Override
public void failure(RetrofitError error) {
try {
handler.setResponseCode(ResponseHandler.RESPONSE_CODE.APP_ERROR);
responseHandler.setDetail(error.toString());
}catch (Exception e){
handler.setResponseCode(ResponseHandler.RESPONSE_CODE.TECHNICAL_ERROR);
responseHandler.setDetail(e.getMessage());
}
}
}
return handler;
}
我遇到的问题是在执行此方法并输入回调后,ResponseHandler中的所有字段都为null。我完全确定回调是执行的,因为我在调试时在回调中设置了断点。
使用RestAdapter类正确初始化apiManagerService对象。
我该如何解决这个问题?
答案 0 :(得分:0)
apiManagerService.getUsers()
仅发起网络请求并返回。在后台线程上响应网络后调用回调。因此,当执行return handler
时,handler
仍为空。更重要的是,即使在回调之后以某种方式返回语句,您可能也看不到由于Java内存模型限制而由后台线程对共享变量(处理程序的字段)所做的更改。