带有 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&lt;List&lt;Review&gt;&gt; 是一个单一的操作,它要么返回数据,要么不返回,而且只执行一次。你想要的是Flowable&lt;List&lt;Review&gt;&gt;。这将允许您订阅数据库并监视更改,当发生更改时,它将向其订阅者报告。

【讨论】:

如果我从onResume()调用viewModel.getAllReview(),它又返回Single,不知道为什么它不起作用..TT 您的FragmentOnResume 或包含的Activity 在片段中...! 在黑暗中拍摄,但onPause 清除您的复合一次性材料。 天哪,我没有想到一次性的概念......正如你所说,我处理它并且效果很好。非常感谢。??

以上是关于带有 RxJava Single 的 Android Livedata 在房间数据库中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有rxjava的迭代列表Android房间,一一

RxJAVA-Single

Android :RxJava学习笔记之Single

RxJAVA-Single

为什么 RxJava 有 Single / Maybe 等单发数据类型,而 Flow 没有?

RxJava 3 映射器