【问题标题】:Issue with Retrofit Callbacks改造回调问题
【发布时间】:2014-07-01 12:11:59
【问题描述】:

我有一个改造接口,它定义了一个带有回调的方法,比如这个:

public interface ApiManagerService {
    @GET("/users/")
    void getUsers(Callback<List<GitHubMember>>);
}

GitHubMember 只是一个具有 3 个字段的 POJO:id、login 和 url。我创建了一个名为 ResponseHandler 的类,我可以在其中包装来自回调的响应。这里是如何定义的:

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中的所有字段都是空的。我完全确定回调已执行,因为我在调试时在回调中设置了断点。

apiManagerService 对象已使用 RestAdapter 类正确初始化。

我该如何解决这个问题?

【问题讨论】:

    标签: java rest retrofit


    【解决方案1】:

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

    【讨论】:

    • 知道如何解决这个问题吗?我可以使用倒计时来等待回调吗?
    • @Dimitri 您可以为此使用事件总线:从回调发布结果并在 Activity 或其他组件的订阅者方法中处理它。例如,您可以使用 Otto 或 EventBus。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多