data-binding - 数据绑定内存泄漏
问题描述
无论如何,这种方法下面是否有可能导致内存泄漏。
android:onClick="@{(v) -> viewModel.showList(v)}
我的理解是,视图引用被传递给视图模型,然后视图模型使用引用并将其内容设置为视图。在fragment销毁时,关联的viewBinder也被销毁,整个屏幕从内存中释放。一旦片段被销毁,是否有传递的视图引用将保留在视图模型中?我不这么认为。
你推荐使用这个符号吗?如果这可能是内存泄漏,您可以分享您的经验吗?
解决方案
在给定的情况下可能是内存泄漏:
假设您单击视图并viewModel.showList(v)
调用此方法以及传递给它的视图引用。
现在想象一下,你有一个全局变量globalViewRef
,ViewModel
它存储了对这个视图的引用,例如:
class MyViewModel: ViewModel(){
lateinit var globalViewRef: View
fun showList(v: View){
globalViewRef = v // Storing view reference globally for future methods/purpose etc.
}
}
并且您在具有活动上下文的ViewModel
片段之间共享,在这种情况下,如果配置更改发生,您的全局视图对象由于上下文的变化而泄漏。viewModel
所以,要记住的事情:
永远不要在类
view/context
中全局存储(仅在必要时在方法内本地使用它)。ViewModel
如果您几乎不需要全局存储某些内容,则覆盖
onCleared()
并清理那里的引用,因为它是ViewModel
要销毁状态时的最后一次调用(在不跨活动上下文共享时考虑这个ViewModel
) 。
如果你已经涵盖了这两件事,那么我可以找到你的情况没有内存泄漏。
推荐阅读
- php - WordPress 迁移到 WordPress 网络
- c# - 当用户取消安装时,WiX 安装程序触发回滚
- vb.net - vb.net 重新保存二进制文件
- deep-learning - Pytorch RuntimeError:“host_softmax”未为“torch.cuda.LongTensor”实现
- android - 在颤振中解析来自 WordPress 自定义帖子类型的 JSON 数据
- java - Java 8 一个流到多个映射
- android - 多种 Gradle 产品风味
- hubot - 我想知道 botbuilder 是如何听的,它在哪里听?
- jakarta-ee - 为什么我的 Tomcat 服务器 7 不能在 Eclipse Luna 中运行?
- android - 移动 Seekbar 不流畅