【问题标题】:Catch http response in Retrofit before passing it to the calling activity在将 http 响应传递给调用活动之前,在 Retrofit 中捕获它
【发布时间】:2014-04-30 08:27:15
【问题描述】:

现在我们正在使用这样的改造:

service.executeSomeRequest(UserPreferenceRequest userPreferenceRequest, new Callback<UserPreferenceResponse>() {
    @Override
    public void success(UserPreferenceResponse responseCallback, Response response) {
        if (responseCallback.getStatus() == ResponseStatus.OK) {
            // Everything is OK, process response
        } else {
            ApiErrorProcessor.process(responseCallback.getError());
        }
    }

    @Override
    public void failure(RetrofitError retrofitError) {
        ServerErrorProcessor.process(retrofitError);
    }
});

但是我们有很多请求,实际上,我们实现的每个请求都需要我们编写相同的错误代码处理(针对 API 和服务器错误),这会重复代码。

我们想要的是只覆盖感兴趣的方法,如果没有提供实现,则执行默认实现。

类似这样的:

service.executeSomeRequest(UserPreferenceRequest userPreferenceRequest, new     
    CustomCallback<UserPreferenceResponse>() {
            @Override
            public void success(UserPreferenceResponse responseCallback, Response response) {
                super.success(responseCallback, response);
                // Everything is OK, process response
            }
    });

CustomCallback 将处理 API 和服务器错误,如果一切正常,然后才将结果传递给调用活动。

在构建RestAdapter 时,setRequestInterceptor(); 允许我在发出请求之前捕获请求,我在想类似的东西,例如 setResponseInterceptor(),这将允许我在将响应传递给之前捕获响应活动并在那里处理一般错误,但没有找到类似的东西。

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    您的自定义回调可以先处理基类中的响应,然后委托给抽象方法。

    public interface StatusResponse {
      Status getStatus();
    }
    
    public abstract class CustomCallback<T extends StatusResponse> implements Callback<T> {
      @Override public final void success(T data, Response response) {
        if (data.getStatus() == Status.OK) {
          success(data);
        } else {
          // Handle error..
        }
      }
    
      public abstract void success(T data);
    }
    

    【讨论】:

    • 我真的很喜欢这种方法。但是在 Retrofit 2 中怎么做呢?覆盖 onResponse 和 onFailure 时,我无法访问通用数据对象。
    • 杰克,你能帮我解决以上问题吗?
    【解决方案2】:

    您可以将改造请求与事件总线结合起来,并有一个干净且集中的点来处理您的响应。

    你需要做的就是定义一个这样的组合对象:

    public class GetUsers {
    // Retrofit Request
    public static final class Request {}
    
    // Retrofit Callback
    public static final class Callback 
          implements retrofit.Callback<Response response> {
    
        @Override
        public void success(Response response, 
             Response retrofitResponse) {
             // .... handle the code
             BusManager.post(new Event());
        }
    
        @Override
        public void failure(RetrofitError error) {}
             BusManager.post(new RetrofitErrorEvent(error));
        }
    
    // Otto Event
    public static final class Event {}
    

    这个对象定义了请求、回调和事件,并且这个对象被提供给改造请求。

     public void getUsers(){
         request.users(new GetUsers.Request(), new GetUsers.Callback());
     }
    

    在这之后,在你的主类中看起来像这样:

    public void onResume(){    
       controller.getUsers();
    }
    
    @Subscribe
    public void onGetPostsEvent(GetPosts.Event event){
        textView.setText(event.getText());
    }
    

    有关更详细的解释,请查看此博客文章: Otto + Retrofit – An elegant solution for Web Requests 你可以找到一个工作示例here

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多