首页 > 解决方案 > 数据绑定内存泄漏

问题描述

无论如何,这种方法下面是否有可能导致内存泄漏。

 android:onClick="@{(v) -> viewModel.showList(v)}

我的理解是,视图引用被传递给视图模型,然后视图模型使用引用并将其内容设置为视图。在fragment销毁时,关联的viewBinder也被销毁,整个屏幕从内存中释放。一旦片段被销毁,是否有传递的视图引用将保留在视图模型中?我不这么认为。

你推荐使用这个符号吗?如果这可能是内存泄漏,您可以分享您的经验吗?

标签: data-bindingviewmodelandroid-databindingandroid-architecture-componentsandroid-viewmodel

解决方案


在给定的情况下可能是内存泄漏:

假设您单击视图并viewModel.showList(v)调用此方法以及传递给它的视图引用。

现在想象一下,你有一个全局变量globalViewRefViewModel它存储了对这个视图的引用,例如:

class MyViewModel: ViewModel(){

    lateinit var globalViewRef: View

    fun showList(v: View){
        globalViewRef = v // Storing view reference globally for future methods/purpose etc.
    }
}

并且您在具有活动上下文的ViewModel片段之间共享,在这种情况下,如果配置更改发生,您的全局视图对象由于上下文的变化而泄漏。viewModel


所以,要记住的事情:

  1. 永远不要在类view/context中全局存储(仅在必要时在方法内本地使用它)ViewModel

  2. 如果您几乎不需要全局存储某些内容,则覆盖onCleared()并清理那里的引用,因为它是ViewModel要销毁状态时的最后一次调用(在不跨活动上下文共享时考虑这个ViewModel) 。

如果你已经涵盖了这两件事,那么我可以找到你的情况没有内存泄漏。


推荐阅读