如何克服toList()的问题原因

时间:2017-08-09 15:19:09

标签: android rx-java rx-java2

它在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次

2 个答案:

答案 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();