为什么;也许吧,doOnDispose“;RxJava2中不支持?

为什么;也许吧,doOnDispose“;RxJava2中不支持?,java,reactive-programming,rx-java2,Java,Reactive Programming,Rx Java2,我在RxJava2中使用类 我注册了回调以检测Dispose事件,但它没有被激发 Maybe.just("aaa") .doOnDispose({ /* do something */ }) .subscribe( ... ) 我查看了rxjava2代码,但是可能似乎不支持doOnDispose 可能是在doOnDispose中创建maybeepeek(不是DoOnDisposeObserver)对象 @CheckReturnValue @SchedulerSupport("n

我在RxJava2中使用类

我注册了回调以检测Dispose事件,但它没有被激发

Maybe.just("aaa")
    .doOnDispose({ /* do something */ })
    .subscribe( ... )
我查看了rxjava2代码,但是
可能
似乎不支持
doOnDispose

可能
是在
doOnDispose
中创建
maybeepeek
(不是
DoOnDisposeObserver
)对象

@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));
}

为什么
Maybe.doOnDispose
不受支持?

正如文档中所说的
doOnDispose(操作onDispose)

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

因为你的下游永远不会处理它,它永远不会调用

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

disposable.dispose();
现在应该调用
doOnDispose
中的操作

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

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

disposable.dispose();

现在应该启动操作。

正如文档中所说的关于
doOnDispose(action onDispose)

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

因为你的下游永远不会处理它,它永远不会调用

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

disposable.dispose();
现在应该调用
doOnDispose
中的操作

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

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

disposable.dispose();

现在动作应该被触发了。

太神奇了!谢谢,太棒了!谢谢