带有 RxJava Single 的 Android Livedata 在房间数据库中不起作用
Posted
技术标签:
【中文标题】带有 RxJava Single 的 Android Livedata 在房间数据库中不起作用【英文标题】:Android Livedata with RxJava Single not work in Room Database 【发布时间】:2021-08-18 08:55:29 【问题描述】:我将 Room 和 RxJava Single
与 Livedata 一起使用,它不起作用。
我尝试了两种方式。我不知道为什么第二个有效,为什么第一个无效。
(1) 单人获取列表 -> 不工作
(2) 通过 Livedata 获取 List -> 工作
(1) 单人获取列表
DAO
@Dao
interface DiaryDao
@Query("SELECT * FROM Review")
fun getAllReview() : Single<List<Review>> // <- See the return type!
视图模型 我使用了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获取List
DAO
@Dao
interface DiaryDao
@Query("SELECT * FROM Review")
fun getAllReview() : LiveData<List<Review>> // <- See the return type!
视图模型
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!
当数据变化时效果很好。
为什么要使用第二种方法?有没有办法让第一种方法起作用?
期待您的建议。
如果您想查看任何其他代码,请告诉我。
【问题讨论】:
【参考方案1】:Single<List<Review>>
是一个单一的操作,它要么返回数据,要么不返回,而且只执行一次。你想要的是Flowable<List<Review>>
。这将允许您订阅数据库并监视更改,当发生更改时,它将向其订阅者报告。
【讨论】:
如果我从onResume()
调用viewModel.getAllReview()
,它又返回Single
,不知道为什么它不起作用..TT
您的Fragment
的OnResume
或包含的Activity
?
在片段中...!
在黑暗中拍摄,但onPause
清除您的复合一次性材料。
天哪,我没有想到一次性的概念......正如你所说,我处理它并且效果很好。非常感谢。??以上是关于带有 RxJava Single 的 Android Livedata 在房间数据库中不起作用的主要内容,如果未能解决你的问题,请参考以下文章