使用 RxJava 将数据从 ViewModel 移动到 Fragment

Posted

技术标签:

【中文标题】使用 RxJava 将数据从 ViewModel 移动到 Fragment【英文标题】:Move data from ViewModel to Fragment using RxJava 【发布时间】:2019-11-23 00:54:33 【问题描述】:

我正在尝试使用 MVVM 架构构建应用程序。 但是当使用 RxJava 下载该值时,我不知道如何将值从 ViewModel 移动到 Fragment。

目前我有这段代码,但我不知道该怎么做。 有人可以帮忙吗?

在片段中:

viewModel.loadListOfCats().observe(this, Observer 
                it?.let 
                    listOfCats.clear()
                    listOfCats.addAll(it.listOfCats)
                    catAdapter.notifyDataSetChanged()
                
            )

在 ViewModel 中:

fun loadListOfCats(): LiveData<ListOfCats>
        compositeDisposable.add(listOfQuizzesRepository.getListOfCats()
            .subscribeWith(object: DisposableSingleObserver<ListOfCats>()
                override fun onSuccess(t: ListOfCats) 
                    val listOfCats= t

                

                override fun onError(e: Throwable) 

                

            ))
        return ?
    

【问题讨论】:

【参考方案1】:

Rx done 通过异步进程工作,而不是同步进程。这意味着当这个函数来到return ? 时,Rx 还没有完成它的工作。

这样你就不能在函数结束时返回从 Rx 获得的值。

您必须在其 onSuccess 和 onError 回调中设置值。

class YourViewModel 
    val listCats = MutableLiveData<ListOfCats>()

    fun loadListOfCats() 
        ...
            override fun onSuccess(t: ListOfCats) 
                listCats.value = t
            
        ...
    


class YourFragment 
    ...
    viewModel.listCats.observe(this, Observer 
        it?.let 
            ...
        
    )

【讨论】:

以上是关于使用 RxJava 将数据从 ViewModel 移动到 Fragment的主要内容,如果未能解决你的问题,请参考以下文章

RxJava + Websocket - 如何将 Observable 添加到 Websocket 监听器?

纯kotlin+ViewModel+LiveData+协程MVVM

使用 rxJava 和改造多次调用另一个请求中的请求

Rxjava 从服务器获取数据并在访问缓存时更新缓存

单元测试 RxJava 超时未订阅

将房间数据库的 AsyncTask 替换为 Rxjava