调用d.dispose()或s.cancel()方法的正确方法是什么?

时间:2017-07-17 10:36:58

标签: rx-java rx-android rx-java2

在RxJava2中,Observer接口和Subscriber接口中引入了一个名为 -

的新方法
interface Subscriber<T>{             
 @Override
 public void onSubscribe(Subscription s)
 {
      s.cancel();
      s.request(5);
 }
....
}

interface Observer<T>{             
     @Override
     public void onSubscribe(Disposable d)
     {
          d.dispose();
     }
    ....
    }

我看到 onSubscribe()方法总是在 onNext(T t)之前第一次调用,我也读过那些文档并发现它的用途是如果您的工作是使用特定的Observable完成的,则处理资源。

问题是我们最初如何知道我们的工作已经完成并且处理取消源和消费者之间的来源或连接? 那么调用 d.dispose() s.cancel() s.request(7)的更好方法是什么?

2 个答案:

答案 0 :(得分:3)

流可以通过两种方式终止:

  1. 错误

  2. 完整

  3. 在这两种情况下,据我所知,您不需要致电处置/取消。确实是reactive stream contract says

      

    当Observable向其发出OnError或OnComplete通知时   观察者,这结束了订阅。

    当然,您可以随时停止您的信息流,然后再以错误结束或完成信息流。在这些情况下,您必须致电处置/取消。使用:

      {li> dispose() Observable {li> cancel() Flowable

    关于request()方法,如果你想建立一个反应性拉动,你需要它,我不认为它与cancel有关。您可以找到更多信息here

答案 1 :(得分:2)

您很少需要调用这些方法,因为take和类似的其他运算符会限制您的流。此外,帮助程序类DisposableObserverDisposableSubscriber为您管理Disposable / Subscription

在某些特殊消费者中,您希望从Subscription.request(1)然后从onSubscribe()拨打onNext(),但没有实际理由可以拨打request()或来自cancel()onError()的{​​{1}},它也没有效果。

例如,以下代码将通过onComplete()应用背压,因为它会消耗一个序列并将其转发到异步后处理逻辑,否则不会识别RxJava:

request(1)

同样,这种情况很少见。在常规ExecutorService exec = Executors.newSingleThreadedExecutor(); source.subscribe(new Subscriber<Data>() { Subscription upstream; @Override public void onSubscribe(Subscription s) { upstream = s; s.request(1); } @Override public void onNext(Data t) { exec.submit(() -> { if (t.isValid()) { process(t.details); upstream.request(1); } else { upstream.cancel(); exec.shutdown(); } }); } @Override public void onError(Throwable ex) { ex.printStackTrace(); exec.shutdown(); } @Override public void onComplete() { exec.shutdown(); } }); 上,您只需拨打Subscriber,因为封闭式调用阻塞性质可确保最后一个上游阶段不会压倒s.request(Long.MAX_VALUE)

onNext

总之,如果没有其他可用数据,则会调用source.subscribe(new Subscriber<Data>() { Subscription upstream; @Override public void onSubscribe(Subscription s) { upstream = s; s.request(Long.MAX_VALUE); } @Override public void onNext(Data t) { if (t.isValid()) { process(t.details); } else { upstream.cancel(); } } @Override public void onError(Throwable ex) { ex.printStackTrace(); } @Override public void onComplete() { } }); ,当您想要指示即使有更多数据可用时也不会进行进一步处理时调用onComplete