在处理时停止rxJava可观察链执行

时间:2017-09-04 18:21:19

标签: android rx-java rx-java2

在应用程序中调试rxJava网络调用时遇到了一种情况,如果我们disposeclear处置对象通过订阅observables链返回,那么只有observable {1}} observablesflatMap放置在其他链式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会停止发出项目。

我想要阻止所有可观察的链接。

解决此问题的惯用方法是什么?

1 个答案:

答案 0 :(得分:5)

两件事:

&#xA;&#xA;
    &#xA;
  • flatMap 可以从上游预先消费项目(在Android上最多16个) ;
  • &#xA;
  • 其次更适用于您的用例,在调用 onNext 之前,您应该检查是否处置了观察者(通过 .isDisposed() )并在发生这种情况时中止。
  • &#xA;
&#xA;&#xA;

此外,第二 flatMap 终止(实际上它永远不会被调用)。 第一个继续。

&#xA;&#xA;

编辑

&#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;