Android MVVM + Databinding,以下代码是否包含对 View/Activity/Context 的引用导致泄漏?

标签 android mvvm data-binding

我要问多个问题,如果不允许,请告诉我我会删除它们,主要问题是......

在哪些情况下ViewModel可能导致泄漏或可能无法使用 MVVM? (如果可能,请推荐可靠的 MVVM 项目进行审核)

import ....View;     //Question 1
import ....Activity;

public class MyViewModel extends ViewModel {

    // Question 2
    public void viewClicked(View v){
        ((TextView)v).setText("Clicked")
    }
}

在一些 layout.xml
<layout>

    <import "android.app.Activity"/>  //Question 3

    <variable
        name="viewModel"
        type="MyViewModel"/>

    <TextView  // Question 4
        ....
        ....
        android:onClick='@{viewModel::viewClicked}'/>

    <Button  //Question 5
        android:id="@+id/btnBack"
        ....
        ....
        android:onClick='@{() -> ((Activity)btnBack.getContext()).finish()}'/>

</layout>

问题一:
Activity的import语句会导致内存泄漏吗?

问题2:
为什么是 viewClicked在 ViewModel 中不推荐使用 type 方法,因为它有助于 View 处理。

问题2.1:
这是 Java 101 的知识,但仍然如此。以 View 作为参数的 ViewModel 方法是否使整个 ViewModel 持有对 View/Context 的引用,因为人们对这些类型的方法更具攻击性。

问题 3:
在数据绑定(bind) XML 中导入 Activity 会导致问题吗?

问题4:
如果不在 View 模型中,应将数据绑定(bind)中的单击逻辑放在 MVVM 中的哪个位置?

问题 5:
您是否应该这样做(请参阅按钮 onClick),因为当您知道后退按钮总是会杀死 Activity 时,您可以直接从 XML 调用完成方法。

最佳答案

1) 代码中的 import 语句本身并没有真正做任何事情。这只是编译器解析类命名空间的一种方式。除非代码引用了该类,否则 JVM 不会真正将导入的类加载到内存中。

2) ViewModel 类旨在保存与 UI 渲染相关的可观察数据。 UI 应观察其数据(例如通过 databinding ),但其本身不应直接引用组成它的特定小部件和 View 。一般来说,ViewModel 根本不应该有 Android 类引用。

2.1) 对 View 的任何引用都包含对封闭上下文/Activity 的引用。这就是为什么一般来说,在任何可能超过 Activity 生命周期的代码(例如非静态 AsyncTask、后台线程回调等)中保存对 View 的引用是不好的做法。我相信有一个特定的 lint 检查可以防止在 ViewModels 中持有 View 。

3) 4) 5) 不要导入 Activity 本身,但不是出于内存泄漏的原因。理想情况下,您的 View 应该只观察 ViewModel。看看这个codelab让 ViewModel 响应事件。如果您需要调用 Activity 方法,请记住您的 Activity 也可以观察 ViewModel。

关于Android MVVM + Databinding,以下代码是否包含对 View/Activity/Context 的引用导致泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56156654/

相关文章:

android - BroadCastReceiver 监听来电并在时间间隔之间工作

Android 谷歌地图自定义我的当前位置

wpf - 如何使用 MVVM 在 WPF 中的多语言数据编辑器中对数据进行建模?

c# - 动态绑定(bind)到 DataTemplate

android - 哪个网络平台最适合使用 Android 客户端创建网络应用程序

android - 使用动画时 Trespass ViewGroup 的 Limits

mvvm - 是否可以在 'click' 绑定(bind)中设置 observable?

wpf - 从 MVVM WPF 中的 View 属性组成复杂模型对象(在 View 模型内)的新模型对象[递归]

wpf - 为什么我的 WPF DataGrids 之一会给出 "' EditItem' is not allowed for this view"异常?

c# - 如何将嵌套的 View 模型绑定(bind)到控件的属性