为什么RxJava2不支持“Maybe.doOnDispose”?

时间:2017-11-09 08:11:43

标签: java reactive-programming rx-java2

我在RxJava2中使用Maybe类。

我注册了doOnDispose回调来检测Dispose事件,但它没有被触发。

Maybe.just("aaa")
    .doOnDispose({ /* do something */ })
    .subscribe( ... )

我查看了RxJava 2代码,但Maybe似乎不支持doOnDispose

MaybeMaybePeek ,,,

中创建DoOnDisposeObserver(不是doOnDispose)对象
@CheckReturnValue
@SchedulerSupport("none")
public final Maybe<T> doOnDispose(Action onDispose) {
    return RxJavaPlugins.onAssembly(new MaybePeek(this, Functions.emptyConsumer(), Functions.emptyConsumer(), Functions.emptyConsumer(), Functions.EMPTY_ACTION, Functions.EMPTY_ACTION, (Action)ObjectHelper.requireNonNull(onDispose, "onDispose is null")));
}

protected void subscribeActual(MaybeObserver<? super T> observer) {
    this.source.subscribe(new MaybePeek.MaybePeekObserver(observer, this));
}

但是,Single是创建DoOnDisposeObserver,并且工作正常。

@CheckReturnValue
@SchedulerSupport("none")
public final Single<T> doOnDispose(Action onDispose) {
    ObjectHelper.requireNonNull(onDispose, "onDispose is null");
    return RxJavaPlugins.onAssembly(new SingleDoOnDispose(this, onDispose));
}

protected void subscribeActual(SingleObserver<? super T> s) {
    this.source.subscribe(new SingleDoOnDispose.DoOnDisposeObserver(s, this.onDispose));
}

为什么不支持Maybe.doOnDispose

1 个答案:

答案 0 :(得分:2)

正如文档中提到的doOnDispose(Action onDispose)

  

如果下游配置序列,则调用dispose动作。

由于你的下游从不处理它,它永远不会打电话。

Disposable disposable = Maybe.just("aaa")
    .doOnDispose({ /* do something */ })
    .subscribe( ... )

disposable.dispose();

现在应调用doOnDispose中的操作。

请注意,如果流的完成所花费的时间少于进行下一个操作(disposable.dispose()),则不应调用onDispose操作。因此,为了验证它,您可以使用延迟:

Disposable disposable = Maybe.just("aaa")
    .delay(2000, TimeUnit.MILLISECONDS)
    .doOnDispose({ /* do something */ })
    .subscribe( ... )

disposable.dispose();

现在应该解雇该行动。