使用 RxAndroid 重试链 2 调用
Chain 2 calls with retry using RxAndroid
我的用例是:我有一个 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);
我的用例是:我有一个 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);