为什么带有房间DAO的Flowable <list>的方法永远不会完成?

时间:2017-08-10 08:23:33

标签: android rx-java rx-java2

从DB中获取数据,Room DAO有一个方法返回一个Flowable userDao.getInfo(),这个Flowable将永远不会完成,我测试添加doOnNext()它会发出5次(DB包含5个项目)但是完成永远不会被调用,但我需要toList(),这可能是替代

return userDatas()
    .flatMapIterable(items -> items)
    .flatMap(userData -> userDao.getInfo(userData.getId())
        .map(user -> user.toStoreModel(...)//added doOnNext()-works 5 times and doOnComplete()doesn't work
  .doOnNext(userData -> Log.i("test",""+userData))
    .doOnComplete(() -> Log.i("test","complete"))
        .toList()
        .map(UserModel::fromUserModels)
        .toFlowable();


@Query("SELECT * FROM user WHERE id = :id") 
Flowable<...> getInfo(Long Id);

  public Flowable<List<UserStore>> userDatas() {
return userDao.allUserDatas()
    .take(1)//added complete and next works 
    .filter(userDatas -> !userDatas.isEmpty())
    .switchIfEmpty(userIds()
        .doOnNext(userDatas -> userDao.insert(userDatas)));

 }

我已经测试过,即使我只使用userDao.allUserDatas()替换userDatas()(我确定它存在于DB中),它也会给出相同的结果

3 个答案:

答案 0 :(得分:3)

您的代码一切正常,它永远不会完成 Db Flowables是可观察的,因此如果数据库发生变化,它们会继续监听,因此它永远不会完成。

答案 1 :(得分:3)

如果你需要调用完整方法,你可以使用take(1)。但是在这种情况下你无法进一步监听数据库更改

答案 2 :(得分:1)

理想情况下,您应该修复userDao以使其正常完成。如果由于某种原因无法做到这一点,你可以将它计时并将错误映射为空,强制完成如下:

userDao.getInfo(userData.getId())
   .timeout(1, TimeUnit.SECOND)
   .onErrorResumeNext(Observable.empty())