从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中),它也会给出相同的结果
答案 0 :(得分:3)
您的代码一切正常,它永远不会完成 Db Flowables是可观察的,因此如果数据库发生变化,它们会继续监听,因此它永远不会完成。
答案 1 :(得分:3)
如果你需要调用完整方法,你可以使用take(1)。但是在这种情况下你无法进一步监听数据库更改
答案 2 :(得分:1)
理想情况下,您应该修复userDao
以使其正常完成。如果由于某种原因无法做到这一点,你可以将它计时并将错误映射为空,强制完成如下:
userDao.getInfo(userData.getId())
.timeout(1, TimeUnit.SECOND)
.onErrorResumeNext(Observable.empty())