我有以下代码结构
服务
public Flowable entryFlow()
{
return Flowable.fromIterable(this::getEntries)
}
消费
void start()
{
disposable = service
.entryFlow()
.observeOn(Schedulers.computation())
.subscribeOn(Schedulers.computation())
.subscribe(
entry -> ...,
this::onError,
this::subscriptionFinished);
}
void stop()
{
disposable.dispose();
}
private void onError(Throwable e)
{
subscriptionFinished();
}
private void subscriptionFinished()
{
//
}
当调用stop方法时,我需要一种方法来阻止flowable从获取和发送数据。
通过执行以下操作,我注意到并不总是调用doOnCancel lambda。
void start()
{
disposable = service
.entryFlow()
.observeOn(Schedulers.computation())
.subscribeOn(Schedulers.computation())
.doOnCancel(this::snapshotFinished)
.subscribe(
entry -> ...,
this::onError,
this::subscriptionFinished);
}
void stop()
{
disposable.dispose();
}
替代方案是
volatile stopped;
void start()
{
disposable = service
.entryFlow()
.observeOn(Schedulers.computation())
.subscribeOn(Schedulers.computation())
.takeUntil(x -> stopped)
.subscribe(
entry -> ...,
this::onError,
this::subscriptionFinished);
}
void stop()
{
stopped = true;
}
什么是推荐的启动和停止实现,以便调用flowable停止发射和onComplete或类似的方法(doOnCancel action?)?
稍后修改:
缩短我的用例
是否足以调用disposable.dispose来阻止可流动的数据从迭代中获取并发送到源?我只有1个订阅者,并且无论原因如何,当flowable结束时都需要调用onComplete / onError / other-callback。
通过其他回调,我的意思是doOnCancel / doFinally等。
谢谢
答案 0 :(得分:1)
我建议使用dispose()
方法。然后只需添加doOnDispose
即可触发副作用代码。