任务取消在RxJava中如何工作?

我不清楚如何在RXJava中执行任务取消.

我有兴趣移植使用Guava的ListenableFuture构建的现有API.我的用例如下:

>我有一个单一的操作,由Futures.transform()加入的一系列期货组成,
多个用户观察操作的最终未来.
>每个观察者可以取消最后的未来,所有观察者都会看到取消事件.
取消最后的未来将取消其依赖,例如按顺序1-> 2-> 3,3的解除传播到2,依此类推.

关于这个问题,RxJava维基有很少的信息;我可以找到的唯一的引用可以找到提到订阅作为相当于.NET的一次性,但据我所见,订阅只提供取消订阅序列中的后续值的能力.

我不清楚如何通过这个API实现“任何用户可以取消”语义.我以错误的方式思考这个问题吗?

任何输入将不胜感激.

了解Cold vs Hot Observables很重要.如果您的Observables感冒,那么如果您没有订阅者,他们的操作将不会执行.因此要“取消”,只需确保所有观察者取消订阅源Observable.

但是,如果只有一名观察员的来源取消订阅,还有其他观察员仍然订阅该来源,则不会产生“取消”.在这种情况下,您可以使用(但它不是唯一的解决方案)ConnectableObservables.另请参阅this link about Rx.NET.

使用ConnectableObservables的一个实用方法是简单地在任何冷的Observable上调用.publish().refCount().这样做是创建一个单独的“代理”观察者,将事件从源中继到实际的观察者.代理观察者取消订阅最后一个实际观察者取消订阅.

要手动控制一个ConnectableObservable,只需调用coldSource.publish(),就可以得到一个ConnectableObservable的实例.那么你可以调用.connect(),它将返回你的“代理”观察者的订阅.要手动“取消”源,您只需取消订阅代理观察者的订阅.

对于您的具体问题,您也可以使用.takeUntil()运算符.

假设您的“最终未来”在RxJava中被移植为finalStream,并且假设“取消事件”为Observables cancelStream1,cancelStream2等,那么“取消”由finalStream产生的操作变得相当简单:

Observable<FooBar> finalAndCancelableStream = finalStream
    .takeUntil( Observable.merge(cancelStream1, cancelStream2) );

在图中,this is how takeUntil worksthis is how merge works.

在简单的英语中,您可以将其读为“finalAndCancelableStream是finalStream,直到cancelStream1或cancelStream2发出事件”.

翻译自:https://stackoverflow.com/questions/25344088/how-does-task-cancellation-work-in-rxjava

转载注明原文:任务取消在RxJava中如何工作?