android - RxJava2 结合不同类型的 Observable

标签 android kotlin rx-java2

我是一个 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

enter image description here

这里是一个实现的例子:

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

enter image description here

正如您在图中所观察到的,第二个 Observable 发出 CD终于。但是第一个 observable 需要一段时间才能发出 3然后 4 .结果对将等到另一个可观察对象发出要配对的元素。

实现同上,替换combineLastestzip .

关于android - RxJava2 结合不同类型的 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51750573/

相关文章:

equals - 我可以将运算符添加到现有的类中吗?

asynchronous - 如何使用 RxJava 发出多个 API 请求并将它们组合起来?

android - SQLiteDatabase Cursor 仅在 Android 5.0+ 设备上为空

javascript - Android (Chrome) 和 playbackRate 属性

spring - 如何在gradle中获取依赖项的元数据?

未找到 Android 单元测试依赖项

android - Dagger 2 范围问题,定义子 fragment 模块。结果 : binding is not resolved for interface

android - 当我选择页面或不选择页面时,如何将 PagerTabStrip 的文本颜色设置为不同

android - RxJava 对直播数据的错误处理

java - 如何根据发出的事件有条件地缓冲分组的 Observable/Flux?