【发布时间】:2017-09-04 18:21:19
【问题描述】:
在应用程序中调试 rxJava 网络调用时,我遇到了一种情况,如果我们通过订阅 observables 链返回的 dispose 或 clear 处置对象,那么只有第一个 observable 被处置而不是其他由flatMap链接observables。
看看下面的演示代码sn-p:
CompositeDisposable testCompositeDisposal = new CompositeDisposable();
private void testLoadData() {
Disposable disposable = Observable.create(sbr -> {
for (int i = 0; i < 5; i++) {
Thread.sleep(3000);
Log.w("Debug: ", "First: " + i);
sbr.onNext(true);
}
sbr.onComplete();
}).subscribeOn(Schedulers.io()).flatMap(value -> Observable.create(sbr -> {
for (int i = 0; i < 5; i++) {
Thread.sleep(3000);
Log.w("Debug: ", "Second: " + i);
sbr.onNext(true);
}
sbr.onComplete();
})).doOnNext(value -> {
Log.w("Debug: ", "doONNext");
}).doOnDispose(()-> {
Log.w("Debug: ", "doOnDispose: observable has been disposed");
}).subscribe();
testCompositeDisposal.add(disposable);
}
@Override
public void onStop() {
super.onStop();
testCompositeDisposal.clear();
}
输出:
W/Debug:: First: 0
W/Debug:: doOnDispose: observable has been disposed // I dispose Observable chain here.
W/Debug:: First: 1
W/Debug:: First: 2
W/Debug:: First: 3
W/Debug:: First: 4
正如您在上面的日志输出中看到的那样,当我处理给定的 rxJava 可观察链时,只有第一个可观察的会停止发射项目。
我想停止所有被链接的可观察对象。
解决这个问题的惯用方法是什么?
【问题讨论】:
-
所有那些 Observable.create 的东西看起来都很邪恶:-)。首先:您还需要将平面映射的 observables 添加到复合一次性用品中。第二:不要到处 create() 。这不是 rxjava 的设计方式。带有 .timeout/.timer/.delay 的 Observable.just( ...) 或 Observable.range() 效果很好。
-
@EmanuelSeibold 这只是我的实现演示。我在这里使用计时器来模拟网络调用。我已经使用 doOnSubscribe 来为平面映射的 observable 获取一次性的。它抛出了奇怪的异常。