java - 使用 RxAndroid 进行链 2 次调用并重试

标签 java android rx-java rx-android

我的用例是:我有一个 Android 应用程序,我需要调用一个 api,当该数据可用时调用第二个 api。 为此,我计划使用 RxAndroid,并进行重试。

我能够通过重试执行 1 个 API 调用,但我需要链接这 2 个,并且能够显示 2 个不同的错误,一个用于调用 1 不可用,一个用于调用 2 不可用。

我可以在整个链上重试,但我更愿意单独重试每个操作。

我的代码如下,我需要在callApi2之前添加一个“callApi1()”,我更喜欢,就像我说的那样,通过重试获得不同的可观察值。

  Observable.create(new Observable.OnSubscribe<String>() {
                @Override
                public void call(Subscriber<? super String> subscriber) {
                    try {
                        subscriber.onNext(callApi2());
                        subscriber.onCompleted();
                    } catch (Exception e) {
                        subscriber.onError(e);
                    }
                }
            })
            .retryWhen(new RetryWithDelay(20, 3000))
            .timeout(TIME_OUT_SECONDS, TimeUnit.SECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(new Subscriber<String>() {
                @Override
                public void onNext(String data) {
                       //show something
                }
             ....
             }

最佳答案

您可以使用Observable.concat operator例如

Observable<String> obs1 = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                try {
                    subscriber.onNext(callApi1());
                    subscriber.onCompleted();
                } catch (Exception e) {
                    subscriber.onError(e);
                }
            }
        })
        .timeout(TIME_OUT_SECONDS, TimeUnit.SECONDS)
        .retryWhen(new RetryWithDelay(20, 3000))            
        .subscribeOn(Schedulers.io());

Observable<String> obs2 = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                try {
                    subscriber.onNext(callApi2());
                    subscriber.onCompleted();
                } catch (Exception e) {
                    subscriber.onError(e);
                }
            }
        })
        .timeout(TIME_OUT_SECONDS, TimeUnit.SECONDS)
        .retryWhen(new RetryWithDelay(20, 3000))            
        .subscribeOn(Schedulers.io());

Observable<String> chained = Observable.concat(obs1,obs2);

关于java - 使用 RxAndroid 进行链 2 次调用并重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37131339/

相关文章:

java - 如何强制hibernate不更新具有相同id的所有实体?

java - 如何在 Java 中通过 TLS/SSL (FTPS) 服务器连接到 FTP

java - RXJava BehaviorSubject 的 Asnyc 初始化

java - RxJava 中的稳健错误处理

java - 响应输出流内容长度?

android - 在android中使用mapsforge的离线 map

java - Android 套接字 : listening doesn't work through 4G

java - 接收 null Parcelable 对象

java - RxJava : onBackpressureBlock() strange behavior

java - OpenNLP 与斯坦福 CoreNLP