我正在使用带有 Room 和 Retrofit 的 RxJava/Kotlin。我确定我刚开始学习 RxJava 时不会写东西。场景是我调用检查数据库中是否有最喜欢的记录并将它们获取到列表中,从 API 获取数据并将其插入数据库中,使用以前的收藏夹列表更新数据库并获取所有记录,现在更新,列表。我在我的片段中得到了结果,但每次我得到它时,就好像我少了 1 个最喜欢的项目,直到我没有最喜欢的项目。
Repository
fun getKafaniFromApi(): Observable<List<Kafana>> {
return apiService.getKafani().toObservable().doOnNext {
insertKafaniInDb(it)
}
}
fun getKafaniFromDb(): Observable<List<Kafana>> {
return kafanaDao.getKafani().toObservable()
}
fun insertKafaniInDb(kafani: List<Kafana>) {
Observable.fromCallable { kafanaDao.insertAll(kafani) }
.subscribeOn(Schedulers.io())
.subscribe {
Timber.d("Inserted ${kafani.size} kafani from API in DB...")
}
}
fun getFavoriteKafani(): Single<List<Kafana>> {
return kafanaDao.getFavoriteKafani()
}
fun setKafanaFavorite(kafana: Kafana, isFavorite: Int) {
return kafanaDao.setFavourite(kafana.name, isFavorite)
}
fun updateFavoriteKafana(kafana: Kafana) {
return kafanaDao.updateFavoriteKafana(kafana)
}
而在我的viewmodel
fun get(): Observable<List<Kafana>> {
return kafanaRepository.getFavoriteKafani()
.toObservable()
.doOnNext { kafaniList = it }
.flatMap { kafanaRepository.getKafaniFromApi() }
.doOnNext { kafaniList?.forEach { kafanaRepository.updateFavoriteKafana(it) } }
.flatMap { kafanaRepository.getKafaniFromDb() }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
我实际上会在我的片段中得到这个列表,但是,正如我所说,它总是会少一个,直到没有。