改造回调问题

时间:2014-06-30 23:12:40

标签: java rest retrofit

我有一个改装界面,用于定义带回调的方法,如下所示:

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对象。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

apiManagerService.getUsers()仅发起网络请求并返回。在后台线程上响应网络后调用回调。因此,当执行return handler时,handler仍为空。更重要的是,即使在回调之后以某种方式返回语句,您可能也看不到由于Java内存模型限制而由后台线程对共享变量(处理程序的字段)所做的更改。