它在toList()
之前到达,我检查了添加doOnEvent()
但在toList()
之后它不起作用并且列表包含5个项目,则会发出5个项目,但它不会更进一步toList()
return userDatas()
.flatMapIterable(items -> items)
.flatMap(userData -> userDao.getInfo(userData.getId())
.map(user -> user.toStoreModel(...)
.toList()
.map(UserModel::fromUserModels)
.toFlowable();
public Flowable<List<UserData>> userDatas() {
return userDao.allUser()
.take(1)
.filter(userDatas -> !userDatas.isEmpty())
.switchIfEmpty(userDataIds()
.doOnNext(userStores -> userStoreDao.insert(userStores)));}
我在每次操作后添加了doOnNext和doOnComplete,并且在flatMap(userData - &gt; userDao.getInfo(userData.getId())doOnNext工作了5次后,但是它没有调用doOnComplete我无法理解在这种情况下,为什么它不调用doOnComplete()
需要发出5次答案 0 :(得分:0)
问题可能是userDao.getInfo()
的Observable(或其他一个可观察者)没有完成。 toList()
只有在源是有限的(即完成)时才能运行。否则,它不知道它是否包含列表中的所有项目。
例如,如果您的Room DAO有一个返回Flowable
的方法,那么Flowable永远不会完成。它会主动监视数据库的更改并根据需要发出更新的查询。
作为另一个例子,您希望以下列表包含哪些内容?
Observable.interval(1, TimeUnit.SECONDS)
.toList()
答案是你不能这样做因为列表是无限的。
答案 1 :(得分:0)
我想您正在使用Room数据库。 调用第一个数据库方法时,尝试使用Single而不是Flowable。
userDao.allUser() - should return Single<List<UserModel>>
然后转换为Flowable
userDao.allUser().toFlowable()
此后,您可以像在示例中一样接收列表
.toList()
.map(UserModel::fromUserModels)
.toFlowable();