android - 数据绑定会从实现 Observable 的 ViewModel 中注销监听器吗?
问题描述
对于我提供给 UI 的数据,我有一些更复杂的逻辑ViewModel
,所以简单地通过暴露数据LiveData
对我来说是行不通的。现在我在 Android文档中看到了我可以在我的文档中实现Observable
以ViewModel
获得我需要的细粒度控制。
但是在文档中它还说:
在某些情况下,您可能更喜欢使用实现 Observable 接口的 ViewModel 组件而不是使用 LiveData 对象,即使您失去了 LiveData 的生命周期管理功能。
内置的Android数据绑定有多智能?它会在必要时自动取消注册它的侦听器(例如,在视图被销毁的情况下更改配置),这样我就不必关心丢失的生命周期功能了吗?还是我必须观看视图的生命周期并取消注册它的听众?(=手动做 LiveData 通常为我做的事情)。
解决方案
没有。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 中添加触发器以清除订阅 - 但它取决于应用程序的特定用例。我只给了一个一般的。
希望能帮助到你。
推荐阅读
- dropzone.js - Dropzone.js 自动旋转图像
- android - 在 Android.mk 中,为 arm64-v8a 启用 OPENMP 会变慢?
- amazon-web-services - 将 tarball 发送到 Amazon S3 - 如何在 s3 url 中指定区域
- python - Django auth 表单跳转到登录页面
- python - Vertical Slices:列表索引必须是整数或切片,而不是元组错误
- java - JDBC 显示语法错误,但查询在 HeidiSQL 中运行良好
- xslt - 使用带计数的 XSLT 转换 XML
- facebook - Microsoft Bot Framework 是否不支持 facebook 页面提要?
- python - 总结特定(多个)范围的数据
- r - 当对应的元素出现在另一列时,我应该如何总结一些值?