带有RxJava Single的Android Livedata无法在房间数据库中工作



我在Livedata中使用了Room和RxJavaSingle,但它不起作用
我试了两种方法。我不知道为什么第二个有效,为什么第一个无效。

(1( 按单个获取列表->不起作用
(2(按Livedata获取列表->工作

(1( 按单个获取列表

DAO

@Dao
interface DiaryDao {
@Query("SELECT * FROM Review")
fun getAllReview() : Single<List<Review>>    // <- See the return type!
}

ViewModel我使用了Repository模式(dao的返回类型和Repository的返回类型相同(

private val _reviewData = MutableLiveData<List<Review>>()
val reviewData : LiveData<List<Review>>
get() = _reviewData
fun getAllReview(){
addDisposable(repo.getAllReview()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
_reviewData.value=it
},{
Log.d(TAG, it.localizedMessage)
})
)
}

碎片

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.getAllReview()
viewModel.reviewData.observe(viewLifecycleOwner) {
...
}
}

它在创建片段时工作,但数据在更改时不会更新。

(2( 按Livedata获取列表

DAO

@Dao
interface DiaryDao {
@Query("SELECT * FROM Review")
fun getAllReview() : LiveData<List<Review>>    // <- See the return type!
}

ViewModel

private val _reviewData : LiveData<List<Review>> = repo.getAllReview()
val reviewData : LiveData<List<Review>>
get() = _reviewData

碎片

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.reviewData.observe(viewLifecycleOwner) {
// it works!
}
}

当数据发生变化时,它能很好地工作。


为什么要使用第二种方法?有没有办法使第一种方法奏效

我期待你的建议。

如果您想查看任何其他代码,请告诉我。

Single<List<Review>>是一个单独的操作,它要么返回数据,要么不返回数据,并且只执行一次。你想要的是Flowable<List<Review>>。这将允许您订阅数据库并监视更改,当发生更改时,它将向订阅者报告。

最新更新