我是一个 RxJava 新手。我掌握了窍门,但有一种情况我不太满意。假设我有一对不同类型的 Observable,它们旨在协同工作。例如:
val list: Observable<List<MyClass>>
val indexIntoList: Observable<Int>
因此,我需要将它们成对观察,以便观察者在 either 列表 或 indexIntoList 获得更新时被发送。现在我的解决方案是这样的:
var lastListUsed: List<MyClass> = ArrayList()
var lastIndexUsed = -1
val syncObject = Object()
init {
list.subscribe(object: Observer<List<MyClass>>{
.
.
.
override fun onNext(t: List<MyClass>)
{
FunctionOnMyClass(t, lastIndexUsed)
}
})
indexIntoList.subscribe(object: Observer<Int>{
.
.
.
override fun onNext(t: Int)
{
FunctionOnMyClass(lastListUsed, t)
}
})
}
fun FunctionOnMyClass(list: List<MyClass>, index: Int)
{
synchronized(syncObject)
{
lastListUsed = list
lastIndexUsed = index
.
.
.
}
}
我想做这样的事情:
var lastMyClass = DefaultMyClass()
list.doOnNext{listVersion ->
indexIntoMap.map{ index ->
if(index in listVersion.indices)
listVersion[index]
else
lastMyClass
}.subscribe(object: Observer<MyClass>{
.
.
.
override fun onNext(t: MyClass)
{
lastMyClass = t
.
.
.
}
})
}
但如果我理解正确,要使用这种方法,每次外部 Observable 更新时,我都必须将 Disposable 释放到内部 Observable 上。我宁愿不那样做。有没有更好的方法来处理这种情况?我是否应该对在外部 Observable 的每次更新时处理 Disposable 持开放态度?
最佳答案
我想你在找 combineLastest
运算符(operator):
when an item is emitted by either of two Observables, combine the latest item emitted by each Observable via a specified function and emit items based on the results of this function
这里是一个实现的例子:
val myListObservable = ...
val myIndexObservable = ...
disposable = Observable.combineLatest(myListObservable, myIndexObservable, BiFunction { list: List<YourType>, index: Int ->
list to index
})
然后您可以直接使用最后一个列表和每个可观察对象发出的 las 索引作为 Pair<List<YourType>,Int>
如果您需要等待每个可观察对象发出一个元素以相互配对,您应该使用 zip
Combine the emissions of multiple Observables together via a specified function and emit single items for each combination based on the results of this function
正如您在图中所观察到的,第二个 Observable 发出 C
和 D
终于。但是第一个 observable 需要一段时间才能发出 3
然后 4
.结果对将等到另一个可观察对象发出要配对的元素。
实现同上,替换combineLastest
与 zip
.
关于android - RxJava2 结合不同类型的 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51750573/