首页 > 解决方案 > 数据绑定会从实现 Observable 的 ViewModel 中注销监听器吗?

问题描述

对于我提供给 UI 的数据,我有一些更复杂的逻辑ViewModel,所以简单地通过暴露数据LiveData对我来说是行不通的。现在我在 Android文档中看到了我可以在我的文档中实现ObservableViewModel获得我需要的细粒度控制。

但是在文档中它还说:

在某些情况下,您可能更喜欢使用实现 Observable 接口的 ViewModel 组件而不是使用 LiveData 对象,即使您失去了 LiveData 的生命周期管理功能

内置的Android数据绑定有多智能?它会在必要时自动取消注册它的侦听器(例如,在视图被销毁的情况下更改配置),这样我就不必关心丢失的生命周期功能了吗?还是我必须观看视图的生命周期并取消注册它的听众?(=手动做 LiveData 通常为我做的事情)。

标签: androidandroid-databindingandroid-livedataandroid-architecture-components

解决方案


没有。ViewModel不会Observable自动注销订阅。不过,您可以手动完成。这很容易。

  • 首先你创建CompositeDisposable
    protected var disposables = CompositeDisposable()
  • 其次,创建您的Observable(可能是一些请求或 UI 事件侦听器)订阅它并将其结果分配给CompositeDisposable
    disposables.add(
        someObservable
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ data ->
                // update UI or some ObservableFields for view/databinding
            }, { exception ->
                // handle errors here
            })
    )
  • 你应该做的最后一件事是像这样覆盖ViewModel's 方法onCleared()
    override fun onCleared() {
        super.onCleared()
        disposables.clear()
    }

这样,添加到您的所有订阅CompositeDisposable都将自动清除

编辑

我只展示了这个例子。您也可以在 onConfigurationChanged 或 onCreate 或 onResume 中添加触发器以清除订阅 - 但它取决于应用程序的特定用例。我只给了一个一般的。

希望能帮助到你。


推荐阅读