如何正确停止rxjava Flowable?

时间:2018-02-12 19:32:21

标签: rx-java rx-java2

我有以下代码结构

服务

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等。

谢谢

1 个答案:

答案 0 :(得分:1)

我建议使用dispose()方法。然后只需添加doOnDispose即可触发副作用代码。