在应用程序中调试rxJava网络调用时遇到了一种情况,如果我们dispose
或clear
处置对象通过订阅observables
链返回,那么只有observable
{1}} observables
被flatMap
放置在其他链式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会停止发出项目。
我想要阻止所有可观察的链接。
解决此问题的惯用方法是什么?
答案 0 :(得分:5)
两件事:
&#xA;&#xA; flatMap
可以从上游预先消费项目(在Android上最多16个) ; onNext
之前,您应该检查是否处置了观察者(通过 .isDisposed()
)并在发生这种情况时中止。 此外,第二 flatMap
终止(实际上它永远不会被调用)。 第一个继续。
编辑
&#xA;&#xA; private void testLoadData(){&#xA;一次性一次性= Observable.create(sbr - &gt; {&#xA; for(int i = 0; i&lt; 5; i ++){&#xA; if(sbr.isDisposed())return; //这将导致订阅终止。&#xA; Thread.sleep(3000);&#xA; Log.w(“Debug:”,“First:”+ i);&#xA; sbr.onNext(true);&#xA ;}&#xA; sbr.onComplete();&#xA;})。subscribeOn(Schedulers.io())。flatMap(value - &gt; Observable.create(sbr - &gt; {&#xA; for(int i = 0; i&lt; 5; i ++){&#xA; Thread.sleep(3000);&#xA; Log.w(“Debug:”,“Second:”+ i);&#xA; sbr。 onNext(true);&#xA;}&#xA; sbr.onComplete();&#xA;}))。doOnNext(value - &gt; {&#xA; Log.w(“Debug:”,“doONNext “);&#xA;})。doOnDispose(() - &gt; {&#xA; Log.w(”Debug:“,”doOnDispose:observable已被处置“);&#xA;})。subscribe( ); &#XA;&#XA; testCompositeDisposal.add(一次性的); &#xA;}&#xA;
&#xA;