Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava对列表执行操作并返回可观察的_Java_Android_Rx Java_Reactive Programming_Rx Java2 - Fatal编程技术网

RxJava对列表执行操作并返回可观察的

RxJava对列表执行操作并返回可观察的,java,android,rx-java,reactive-programming,rx-java2,Java,Android,Rx Java,Reactive Programming,Rx Java2,我对RxJava(特别是RxJava2)还不太熟悉,而且我对一个相对简单的操作有一些问题。我需要从数据库中获取一些数据,遍历数据(它表示为一个列表),对每个项执行操作,将数据包装到另一个对象中并返回。这就是我到目前为止所做的: mDataManager .getStuffList(id) .flatMapIterable(listOfStuff -> listOfStuff) .flatMap(item -> mDataManager

我对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));

我遇到的问题是,我的数据管理器调用从未完成。其思想是,只要底层数据发生变化,UI也会随之变化。但是,如果不完成这些调用,toList()将不会发出事件。

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

关于您的其他更改,当基础数据更改时,您所说的
是什么意思?您的数据经理是否会在数据更改时通知您

编辑:如果您的
mDataManager.getStuffList(id)
调用返回一个发出多个项目的
可观察的
(即,它从未完成,但总是在更改后发出最新的数据集),那么您需要执行以下操作:

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

是的,我使用的是
SqlBrite
,它是安卓SQLite助手类的Rx包装器,它在数据更改时提供通知。但是如果我正确理解了自己的代码,toList()会阻止我在第一次通知之后收到这些通知吗?还是我遗漏了什么?是的,我使用的是RxJava2Well,如果您需要多次调用
mDataManager.getStuffList
(每次数据更改一次),那么您需要将所有内容打包。如果每当数据库中的内容发生变化时,
getStuffList
调用返回一整套项目,那么您应该跳过
FlatMapetable
并将所有内容嵌套在该flatMap中。您能提供后一种示例吗?我不太清楚你的意思,谢谢,但我仍然有这个问题-它似乎没有编译。首先,我想你的意思是
Observable.fromIterable()
,因为在这个对象上没有
from
方法?我应该在哪里使用
toList()
操作符?据我所知,您建议的想法是从数据库中返回可观察对象,并通过flatMap对每个项目执行操作。但是我在
doOnNext