具有 rx 顺序请求的 Android retrofit2

标签 android retrofit rx-java

我在 Rx 中使用 retrofit2。我有两个 API 调用。如果第一次调用返回代码为 400 的空响应,我需要进行第二次 API 调用,否则只是为了显示结果。我已经实现了如何显示的自定义错误处理 here .这是我的解决方案:

getResponse1(token)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new ObserverErrorImpl<Response1, BaseError>(BaseError.class) {
                @Override
                public void onNext(Response1 response) {
                    view.onSuccess(response);
                }

                @Override
                public void onClientError(BaseError response) {
                    getResponse2(token)
                            .subscribeOn(Schedulers.newThread())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(new ObserverErrorImpl<Response2, BaseError>(BaseError.class) {

                                @Override
                                public void onNext(Response2 response) {
                                    view.onSuccess(response);
                                    view.hideProgress();
                                }

                                @Override
                                public void onError(Throwable throwable) {
                                    super.onError(throwable);
                                    view.hideProgress();
                                }
                            });
                }

                @Override
                public void onError(Throwable throwable) {
                    super.onError(throwable);
                    view.hideProgress();
                }
            });

是否可以简化方法 onClientError 中的这段代码?喜欢那样是好的解决方案吗?

最佳答案

1). 为了简化,最好是Response1Response2将扩展一些基类,因此在您的链中,您可以使用基类进行操作,可以在需要时将其转换为特定类型

那么,假设您有 BaseResponse :

public abstract class BaseResponse{

    public static int TYPE_RESPONSE_1 = 1;
    public static int TYPE_RESPONSE_2 = 2;

    public abstract int getType();    //every class MUST override this method
}

Response1Response2应该覆盖 BaseResponse

2). getResponse1getResponse2应该返回 Observable<BaseResponse>

3).您的目标代码:

    getResponse1(token)
            .onErrorResumeNext(new Func1<Throwable, Observable<BaseResponse>>() {
                @Override
                public Observable<BaseResponse> call(Throwable throwable) {
                    // I use Retrofit 1.9
                    // And in Retrofit 1.9 I have class RetrofitError, which may provide me all info about error
                    // I'm absolutelly sure Retrofit 2 also have such class,
                    // but it may have another name
                    if(/* is your target error */){
                        //cast it tour target error
                        return getResponse2(token);
                    }
                    return Observable.error(throwable);
                }
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new ObserverErrorImpl<Response1, BaseError>(BaseError.class) {
                @Override
                public void onNext(BaseResponse response) {
                    if(response.getType() == BaseResponse.TYPE_RESPONSE_1){
                        view.onSuccess(response);
                    } else {
                        view.onSuccess(response);
                        view.hideProgress();
                    }
                }

                @Override
                public void onError(Throwable throwable) {
                    super.onError(throwable);
                    view.hideProgress();
                }
            });

关于具有 rx 顺序请求的 Android retrofit2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39882215/

相关文章:

android - 如何初始化MoPub?

android - 使用 RxJava for Android 重试 observable 直到满足某些条件

java - 使用 RxJava 链接方法调用

android - 如何停止处理程序?

Php脚本获取json字符串中目录中所有图像的url

android - Retrofit 接口(interface)中 Call 和 Observable Response 的区别

android - 如何使用相同的键但不同的索引发送数组或字符串列表进行改造?

android - Okhttp - OkHttpClient 2.0.0 无法解析方法拦截器()

java - 从过滤后的 Observable 返回最终列表

javascript - 将项目升级到最新版本的 Cordova 4.0.0 时,控制台出现 TypeError "Cannot set property connection of#<Navigator>"