如何解决RxJava设计问题:retryWhen和concat实现所需的功能
背景: 我有一个观察到的返回模拟项目和实际项目。模拟项目用于ui中,而实际项目仍在进行中。模拟项应始终首先到达,以防止意外覆盖ui中的实际项。前提是ui层是愚蠢的,它既不知道它正在显示哪些项目,也不知道以任何方式对其进行管理。因此,可观察到的唯一物品来源。简化后看起来像这样。
val one = Observable.fromCallable { "Mock/cached items" }
val two = Observable.fromCallable { "Live items" }
val result = Observable.concat(listOf(one,two))
.subscribe {
println(it)
}
现在,我想重播此可观察值,因为在更下游,它只是通过combineLatest()运算符组合在一起的许多可观察值中的一个,因此我无法单独对其进行订阅。因此,我在concat()之后添加了replayWhen(...),一切正常。
问题: 当我在某些情况下只需要重播模拟项目而不是在其他情况下重播所有项目时,事情变得棘手。尝试失败:
val subject1 = PublishSubject.create<Unit>()
val subject2 = PublishSubject.create<Unit>()
val one = Observable.fromCallable { "Mock/cached items" }.repeatWhen { subject1 }
val two = Observable.fromCallable { "Live items" }.repeatWhen { subject2 }
val result = Observable.concat(listOf(one,two))
.subscribe {
println(it)
}
subject1.onNext(Unit)
subject2.onNext(Unit)
很明显,它只打印模拟项,而没有调用实时项(不久以后:-)。这是因为concat从第一个可观察的开始等待onComplete,因为重播运算符不会发生这种情况。
解决方案及其缺点:
- 用合并替换 concat 。这样,两个可观察的对象都可以工作,但是不能保证可观察的一个会在可观察的两个之前触发。有没有办法在没有concat的情况下实现可观察对象之间的排序?
- 在concat之后具有replayWhen(),可整体重播此结果,但可观察到的 two 的.fromCallable {}中包含一些内容,以知道何时跳过它。不知道会是什么,因为一个简单的标志将不可靠并且依赖于可能偶尔更改的外部状态。
感谢您提出其他任何想法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。