在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)的更好方法是什么?
答案 0 :(得分:3)
流可以通过两种方式终止:
错误
完整
在这两种情况下,据我所知,您不需要致电处置/取消。确实是reactive stream contract says:
当Observable向其发出OnError或OnComplete通知时 观察者,这结束了订阅。
当然,您可以随时停止您的信息流,然后再以错误结束或完成信息流。在这些情况下,您必须致电处置/取消。使用:
dispose()
Observable
{li> cancel()
Flowable
关于request()
方法,如果你想建立一个反应性拉动,你需要它,我不认为它与cancel
有关。您可以找到更多信息here
答案 1 :(得分:2)
您很少需要调用这些方法,因为take
和类似的其他运算符会限制您的流。此外,帮助程序类DisposableObserver
和DisposableSubscriber
为您管理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
。