我在RxJava2中使用Maybe类。

我注册了doOnDispose回调以检测Dispose事件,但未触发。

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


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

Maybe是在MaybePeek中创建的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是create 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

最佳答案

如文档所述,关于doOnDispose(Action onDispose)


  如果下游处理序列,则调用处理操作。


由于您的下游永远不会处理它,因此它永远不会调用。

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();


现在该动作应该被解雇。

关于java - 为什么RxJava2不支持“Maybe.doOnDispose”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47196879/

10-11 10:35