在此方法下面是否有可能导致内存泄漏。
android:onClick="@{(v) -> viewModel.showList(v)}
我的理解是,视图引用传递给视图模型,然后视图模型使用引用并将其内容设置为视图。在片段销毁时,关联的 viewBinder 也被销毁,整个屏幕从内存中释放出来。一旦片段被销毁,视图模型中是否会保留传递的视图引用?我不这么认为。
你建议使用这种符号吗?如果这是内存泄漏的可能性,您能分享您的经验吗?
在给定的情况下,这可能是内存泄漏:
假设您单击视图,并且viewModel.showList(v)
调用此方法以及传递给它的视图引用。
现在假设您在ViewModel
中存储对此视图的引用的全局变量globalViewRef
,例如:
class MyViewModel: ViewModel(){
lateinit var globalViewRef: View
fun showList(v: View){
globalViewRef = v // Storing view reference globally for future methods/purpose etc.
}
}
并且您的ViewModel
在具有活动上下文的片段之间共享,在这种情况下,如果发生配置更改,您的viewModel
由于上下文更改而泄漏全局视图对象。
因此,要记住的事项:
切勿
ViewModel
类中全局存储view/context
(仅在必要时才在方法中本地使用它(。如果有一些东西你几乎不需要全局存储,那么覆盖
onCleared()
并清理那里的引用,因为它是ViewModel
要销毁状态时的最后一次调用(当ViewModel
没有跨活动上下文共享时考虑这一点(。
如果您同时涵盖了这两件事,那么我找不到您的案例中的内存泄漏。