RxJava 对列表执行操作并返回一个可观察对象

vki*_*ins 5 java android reactive-programming rx-java rx-java2

我是 RxJava(特别是 RxJava2)的新手,我在似乎相对简单的操作上遇到了一些麻烦。我需要从数据库中获取一些数据,遍历数据(它表示为一个列表),对每个项目执行操作,将数据包装在另一个对象中并返回。这是我到目前为止:

mDataManager
    .getStuffList(id)
    .flatMapIterable(listOfStuff -> listOfStuff)
    .flatMap(item ->
         mDataManager
             .performCount(id, item.getTitle())
             .doOnNext(item::setCounter)
             .takeLast(1)
             .map(counter -> item))
    .toList()
    .toObservable()
    .flatMap(listOfStuff -> Observable.just(new StuffWrapper(listOfStuff));
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是我的数据管理器调用永远不会完成。这个想法是,每当底层数据发生变化时,UI 也会发生变化。但是,如果没有完成这些调用, toList() 将不会发出该事件。

Tas*_*kos 1

在 RxJava 2 中,toList返回 a Single:它相当于Observable只有一个项目的 an 。您可以通过添加 将其转换为 Observable .toObservable,但这并不经常需要。

关于您的其他变化,您的意思是什么whenever the underlying data changes?您的数据管理员会通知您数据更改吗?

编辑:如果您的mDataManager.getStuffList(id)调用返回一个Observable发出多个项目的对象(也就是说,它永远不会完成,但总是在更改后发出最新的数据集),那么您需要执行以下操作:

mDataManager
.getStuffList(id)
.flatMap(listOfStuff ->
    Observable
    .from(listOfStuff)
    .flatMap(item ->
         mDataManager
             .performCount(id, item.getTitle())
             .doOnNext(item::setCounter)
             .takeLast(1)
         .map(counter -> item)
         .toList()
    )
)
...
Run Code Online (Sandbox Code Playgroud)