当前位置: 首页 > 知识库问答 >
问题:

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

司徒耀
2023-03-14

我不清楚如何在RXJava中实现任务取消。

我对移植使用Guava的ListenableFuture构建的现有API很感兴趣。我的用例如下:

  • 我有一个单独的操作,它由一系列由未来连接的未来组成。transform()

RxJava wiki中关于这一点的信息很少;我能找到的唯一取消参考提到订阅等效于. NET的Disposable,但据我所知,订阅仅提供取消订阅序列中后续值的能力。

我不清楚如何通过这个API实现“任何订阅者都可以取消”语义。我是不是想错了?

如有任何意见,将不胜感激。

共有1个答案

璩无尘
2023-03-14

了解冷态和热态的观测值是很重要的。如果您的可观察对象是冷的,那么如果您没有订阅者,它们的操作将不会执行。因此,要“取消”,只需确保所有观察者都取消订阅源可观察对象。

但是,如果只有源的一个观察者取消订阅,并且还有其他观察者订阅了源,则不会导致“取消”。在这种情况下,您可以使用(但这不是唯一的解决方案)可连接的可观察对象。另请参阅有关Rx的链接。净额。

使用ConnectableObservables的一种实用方法是调用。发布()。refCount()在任何可观察到的冷态上。这样做的目的是创建一个“代理”观察者,将事件从源传递到实际观察者。代理观察员在最后一个实际观察员退订时退订。

要手动控制ConnectableObservable,只需调用coldSource。publish(),您将获得ConnectableObservable的一个实例。然后您可以调用。connect()将返回“代理”观察者的订阅。要手动“取消”源,只需取消订阅代理观察者。

对于您的特定问题,也可以使用。takeUntil()运算符。

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

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

在图中,takeUntil就是这样工作的,merge也是这样工作的。

用通俗易懂的英语来说,你可以把它理解为"finalAndCanelableStream是finalStream,直到取消Stream1或取消Stream2发出一个事件"。

 类似资料:
  • 我是RxJava的新手。我有一个,用于下载图像URL列表并将其转换为位图的简单网络操作。 在活动的上,我取消订阅可观察到的以避免内存泄漏。 我能看到的是,如果我在图像下载过程中退出活动,后台任务也会被终止。我只想继续做背景工作,即使我已经取消了《观察家》的订阅。有可能吗?

  • 在这篇文章之后,我正在使用带有RxJava/RxKotlin Flowable的Room。我让它运行,但在带有3个片段的ViewPager中使用它存在问题。 我将向您介绍我的代码: 我有一个带有选项卡布局和三个片段(A、B和收藏夹)的视图分页器。前两个片段包含可以添加到收藏夹的数据列表。 在最喜欢的片段中,我使用Flowable来监听A和B所做的更改并相应地更新列表。但是,当一个项目在A和B中成为

  • 自JDK5.0以来,Java引入了自动装箱/取消装箱。这个技巧很简单而且很有帮助,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念在Java是如何工作的。例如: 拳击 在尝试了不同的情况(、、、)后,编译器接受的唯一情况是做作运算符右侧值的类型为。当我查看的源代码时,我发现它只实现了一个带有参数的构造函数。 所以我的结论是自动装箱的概念是基于在包装类中实现的构造函数。

  • 我正在考虑使用具有动态消息名称的中断边界事件,这样我就可以确保只取消特定任务。我正在尝试建立一种只取消特定任务的通用模式(例如,由任务ID标识)。因此,我希望在边界事件的消息名中使用任务的ID。这可能吗? 否则,实现能够取消/删除特定任务的预期结果的最佳方法是什么? 我也看过这篇文章,但它没有解决我对动态命名的具体疑问

  • 问题内容: 我将Redis作为经纪人使用Celery(3.0.15)。 有没有一种简单的方法来查询Celery队列中存在的具有给定名称的任务数? 并且,作为后续措施,是否可以取消Celery队列中存在的所有具有给定名称的任务? 我已经看过《监控和管理指南》,在那儿看不到解决方案。 问题答案: