重试后未调用 doOnCompleted
doOnCompleted not called after retryWhen
我有这样的东西:
service.getStuff()
.map(...)
.observeOn(AndroidSchedulers.mainThread())
.retryWhen(errors -> errors.flatMap(t -> {
return otherObservable.doOnNext(someSideEffect);
}))
.doOnCompleted(() -> onComplete())
.subscribe(onNext() , onError());
onNext()
执行,并在 onComplete()
上调用来自 service.getStuff()
的原始可观察对象
问题:doOnCompleted()
没有执行。
原始可观察值(service.getStuff)是:
Observable.create(new Observable.OnSubscribe<InputStream>() {
@Override
public void call(final Subscriber<? super InputStream> subscriber) {
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
subscriber.onError(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
subscriber.onNext(response.body().byteStream());
Log.d("HTTP", "calling complete");
subscriber.onCompleted();
Log.d("HTTP", "called complete");
}
});
}
}
我不完全理解发生了什么,但是在找到 this similar discussion 之后我在没有 flatMap 的情况下重新实现了它并且它有效:
.retryWhen(errors -> errors.zipWith(otherObservable, dummyZipFunction));
我有这样的东西:
service.getStuff()
.map(...)
.observeOn(AndroidSchedulers.mainThread())
.retryWhen(errors -> errors.flatMap(t -> {
return otherObservable.doOnNext(someSideEffect);
}))
.doOnCompleted(() -> onComplete())
.subscribe(onNext() , onError());
onNext()
执行,并在 onComplete()
上调用来自 service.getStuff()
问题:doOnCompleted()
没有执行。
原始可观察值(service.getStuff)是:
Observable.create(new Observable.OnSubscribe<InputStream>() {
@Override
public void call(final Subscriber<? super InputStream> subscriber) {
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
subscriber.onError(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
subscriber.onNext(response.body().byteStream());
Log.d("HTTP", "calling complete");
subscriber.onCompleted();
Log.d("HTTP", "called complete");
}
});
}
}
我不完全理解发生了什么,但是在找到 this similar discussion 之后我在没有 flatMap 的情况下重新实现了它并且它有效:
.retryWhen(errors -> errors.zipWith(otherObservable, dummyZipFunction));