Android 在将http响应传递给调用活动之前,捕获改造中的http响应

Android 在将http响应传递给调用活动之前,捕获改造中的http响应,android,retrofit,Android,Retrofit,目前,我们正在使用如下改装: service.executeSomeRequest(UserPreferenceRequest userPreferenceRequest, new Callback<UserPreferenceResponse>() { @Override public void success(UserPreferenceResponse responseCallback, Response response) { if (resp

目前,我们正在使用如下改装:

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);
    }
});
service.executeSomeRequest(UserPreferenceRequest userPreferenceRequest, new     
    CustomCallback<UserPreferenceResponse>() {
            @Override
            public void success(UserPreferenceResponse responseCallback, Response response) {
                super.success(responseCallback, response);
                // Everything is OK, process response
            }
    });
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 onResume(){    
   controller.getUsers();
}

@Subscribe
public void onGetPostsEvent(GetPosts.Event event){
    textView.setText(event.getText());
}
service.executeSomeRequest(UserPreferenceRequest UserPreferenceRequest,new Callback()){
@凌驾
public void成功(userpreferenceresponsecallback,Response-Response){
if(responseCallback.getStatus()==ResponseStatus.OK){
//一切正常,过程响应
}否则{
进程(responseCallback.getError());
}
}
@凌驾
公共无效故障(改型错误改型错误){
ServerErrorProcessor.process(错误);
}
});
但是我们有很多请求,实际上,我们实现的每个请求都要求我们编写相同的错误代码处理(对于API和服务器错误),这会复制代码

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

大概是这样的:

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);
    }
});
service.executeSomeRequest(UserPreferenceRequest userPreferenceRequest, new     
    CustomCallback<UserPreferenceResponse>() {
            @Override
            public void success(UserPreferenceResponse responseCallback, Response response) {
                super.success(responseCallback, response);
                // Everything is OK, process response
            }
    });
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 onResume(){    
   controller.getUsers();
}

@Subscribe
public void onGetPostsEvent(GetPosts.Event event){
    textView.setText(event.getText());
}
service.executeSomeRequest(UserPreferenceRequest UserPreferenceRequest,新建
CustomCallback(){
@凌驾
public void成功(userpreferenceresponsecallback,Response-Response){
超级成功(responseCallback,response);
//一切正常,过程响应
}
});
CustomCallback
将处理API和服务器错误,如果一切正常,则只将结果传递给调用活动


构建
RestAdapter
时,存在
setRequestInterceptor()
允许我在发出请求之前捕获请求,我想到了类似的方法,比如
setResponseInterceptor()
,这将允许我在将响应传递给活动之前捕获响应,并处理一般错误,但是没有找到类似的内容。

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

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);
}
公共接口状态响应{
状态getStatus();
}
公共抽象类CustomCallback实现回调{
@覆盖公共最终无效成功(T数据、响应){
if(data.getStatus()==Status.OK){
成功(数据);
}否则{
//处理错误。。
}
}
公开摘要无效成功(T数据);
}

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

您只需定义一个组合对象,如下所示:

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);
    }
});
service.executeSomeRequest(UserPreferenceRequest userPreferenceRequest, new     
    CustomCallback<UserPreferenceResponse>() {
            @Override
            public void success(UserPreferenceResponse responseCallback, Response response) {
                super.success(responseCallback, response);
                // Everything is OK, process response
            }
    });
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 onResume(){    
   controller.getUsers();
}

@Subscribe
public void onGetPostsEvent(GetPosts.Event event){
    textView.setText(event.getText());
}
在此之后,在主类中,如下所示:

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);
    }
});
service.executeSomeRequest(UserPreferenceRequest userPreferenceRequest, new     
    CustomCallback<UserPreferenceResponse>() {
            @Override
            public void success(UserPreferenceResponse responseCallback, Response response) {
                super.success(responseCallback, response);
                // Everything is OK, process response
            }
    });
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 onResume(){    
   controller.getUsers();
}

@Subscribe
public void onGetPostsEvent(GetPosts.Event event){
    textView.setText(event.getText());
}
有关更详细的说明,请查看此博客帖子:
你可以找到一个有效的例子

我非常喜欢这种方法。。但如何才能做到这一点,在改装2?在重写onResponse和onFailure时,我无法访问通用数据对象。Jake,你能帮我解决上述问题吗?