rx-java2 - 是否有一个 RxJava 主题可以缓存值并在发出后忘记它们?
问题描述
我正在寻找一种Subject
可以实现某种行为的类型(或某种运算符组合)。
- A
Subject
已创建 - A
Subject
被onNext()
多次调用,所有这些值都被缓存在Subject
- A
Consumer
订阅了那个Subject
Consumer
接收所有已缓存的值Consumer
取消订阅..通过Subject
调用dispose()
Subject
用 2个onNext()
新值调用A- A
Consumer
订阅了那个Subject
- 应该只接收 2 个新
Consumer
值,因为旧值已经发出。
我需要的基本上是 aReplaySubject
和 a之间的特殊情况BehaviourSubject
。
ReplaySubject
重播所有事件..BehaviourSubject
重播最后一个事件。
我想要一个Subject
只重播尚未消费的事件。换句话说 ..Subject
发出时没有订阅者的事件。
为了完成,这是一个澄清行为的测试用例
@Test
public void test() {
Subject<String> subject = MyDesiredSubject.create();
subject.onNext("1");
subject.onNext("2");
TestObserver<String> testObserver = subject.test();
testObserver.assertValues("1", "2");
testObserver.dispose();
subject.onNext("3");
subject.onNext("4");
testObserver = subject.test();
testObserver.assertValues("3", "4");
}
解决方案
您可以DispatchWorkSubject
在https://github.com/akarnokd/RxJava2Extensions中使用。
一种主题变体,它缓冲项目并允许一个或多个观察者异步独占使用缓冲区中的一个项目。如果没有观察者(或它们都被释放),DispatchWorkSubject 将继续缓冲,稍后观察者可以恢复对缓冲区的消耗。
但是,如果您一次只想支持最多1 个订阅者,那么UnicastWorkSubject
(也在 Rx2 扩展中)。
推荐阅读
- python - 生成多散点图 - 返回意外结果
- javascript - 确定下一个有节假日的工作日/工作日
- sql - 如何使用 R 迭代地对 SQL 表中的每一列运行查询?
- python - 有没有办法在numpy中获得最大值矩阵?
- ios - 无法使用 iOS swift 在谷歌地图上加载自定义图块
- python - Python包含shell路径文件名
- google-apps-script - 如何在同一个单元格上迭代
- excel - 我正在尝试将一行中的特定列复制到另一个 Excel 工作表,因为它满足两个条件
- azure-devops - DevOps Pipeline - 在构建步骤中找不到包
- android-studio - Kotlin Coroutines,retrofit-2.6.1,网络响应 null