【问题标题】:How to observe ViewModel that makes a request for a call back如何观察发出回调请求的 ViewModel
【发布时间】:2019-04-02 18:06:09
【问题描述】:

我正在尝试向一个图书馆发出请求,该图书馆给我回电。

Manager.getInstance().request(new CallBack())

我想把它放在一个 ViewModel 中,这样我就可以从Activity 观察它。

class RequestViewModel : ViewModel, CallBack {

    fun request() {
        Manager.getInstance().request(this)
    }

    override fun onFinished(result : List<String>?) {
    }

    override fun onFailed() {
    }
}

我怎样才能使它完成,以便我可以观察它何时完成?我知道我可以让我的Activity 实现此CallBack,但我不想将Activity 与此结合。

理想情况下,这将是 LiveData 或 Observable。

【问题讨论】:

    标签: android kotlin observable android-livedata


    【解决方案1】:

    如果我对问题的理解正确,您可以将onFinished方法中获取的数据提交给视图组件应该观察到的LiveData实例,例如

    class RequestViewModel : ViewModel, CallBack {
    
        private val _liveData = MutableLiveData<SomeResult<List<String>>>
        val liveData: LiveData<SomeResult<List<String>>> get() = _liveData
    
        fun request() {
            Manager.getInstance().request(this)
        }
    
        override fun onFinished(result : List<String>?) {
            if (result != null) {
                _liveData.postValue(SomeResult.success(result))
            } else {
                _liveData.postValue(SomeResult.failure())
            }
        }
    
        override fun onFailed() {
            _liveData.postValue(SomeResult.failure())
        }
    }
    

    在你的对象中的某个地方对应于一个视图组件:

    viewModel.liveData.observe(lifecycleOwner, Observer<List<String>> {
        handleResponse(it)
    })
    

    lifecycleOwner 通常是您的AppCompatActivityandroid.support.v4.Fragment 继承者。

    【讨论】:

    • 您可能还想考虑让回调实例只是 ViewModel 中的一个字段或一些匿名实例。如果该回调仅在该 ViewModel 中有用且相关,则将其从应用程序的其余部分隐藏起来就更干净了。上述答案的其余部分也是我将如何做到的,只需让 Activity 通过 LiveData 观察结果,而不是实现 Callback 接口本身。
    【解决方案2】:

    我建议您将请求与 ViewModel 分离,并创建一个名为 Repository 的类来处理所有请求。在此类中,您可以拥有一个可以观察到的MutableLiveData 对象,并且每当检索到新请求的数据时,使用mutableLiveData.postValue(retrievedData) 表示MutableLiveData,它会通知观察者有关新更改的信息。

    要阅读有关存储库的更多信息,您可以点击以下链接:

    Google's Guide to App Architecture

    Codelab tutorial with Repository pattern

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      相关资源
      最近更新 更多