Android 安卓MVVM+;数据绑定时,以下代码是否包含对视图/活动/上下文的引用,从而导致泄漏?

Android 安卓MVVM+;数据绑定时,以下代码是否包含对视图/活动/上下文的引用,从而导致泄漏?,android,mvvm,data-binding,Android,Mvvm,Data Binding,我将问多个问题,如果不允许,请让我知道我将删除它们。主要问题是 在哪些情况下,ViewModel可能导致泄漏,或者可能不使用MVVM?(如有可能,请推荐可靠的MVVM项目供审查) 在一些layout.xml中 <layout> <import "android.app.Activity"/> //Question 3 <variable name="viewModel" type="MyViewModel"/&g

我将问多个问题,如果不允许,请让我知道我将删除它们。主要问题是

在哪些情况下,
ViewModel
可能导致泄漏,或者可能不使用MVVM?(如有可能,请推荐可靠的MVVM项目供审查)

在一些
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>

//问题3
问题1: 活动的导入语句是否会导致内存泄漏

问题2: 为什么
viewClicked
type方法有助于视图处理,但不建议在ViewModel中使用

问题2.1: 这是Java101知识,但仍然是。带有View作为参数的ViewModel方法是否会使整个ViewModel保留对View/Context的引用,因为人们对这些类型的方法更具攻击性

问题3: 导入数据绑定XML中的活动是否会导致问题

问题4: 如果不在viewmodel中,那么数据绑定中的单击逻辑应该放在MVVM中的何处

问题5: 当您知道back按钮总是会终止活动时,您可以直接从XML调用finish方法,所以您应该这样做(请参阅Button onClick)。

1)代码中的导入语句本身并不会真正起作用。这只是编译器解析类名称空间的一种方法。JVM不会将导入的类真正加载到内存中,除非该类被代码引用

2) ViewModel类用于保存与UI呈现相关的可观察数据。它的数据应该由UI观察(例如通过),但其本身不应该直接引用构成它的特定小部件和视图。通常,ViewModel应该根本没有Android类引用

2.1)对视图的任何引用都包含对封闭上下文/活动的引用。这就是为什么通常情况下,在任何可能超过活动生命周期的代码段(例如,非静态异步任务、后台线程回调等)中保留对视图的引用是不好的做法。我相信在ViewModels中有一个特定的lint检查来防止视图被保留

3) 4)5)不要导入活动本身,但不是因为内存泄漏的原因。理想情况下,视图应该只观察ViewModels。让ViewModels响应事件时,请看这一点。如果您需要调用活动方法,请记住,您的活动也可以观察ViewModels。

1)代码中的导入语句本身并不会真正起作用。这只是编译器解析类名称空间的一种方法。JVM不会将导入的类真正加载到内存中,除非该类被代码引用

2) ViewModel类用于保存与UI呈现相关的可观察数据。它的数据应该由UI观察(例如通过),但其本身不应该直接引用构成它的特定小部件和视图。通常,ViewModel应该根本没有Android类引用

2.1)对视图的任何引用都包含对封闭上下文/活动的引用。这就是为什么通常情况下,在任何可能超过活动生命周期的代码段(例如,非静态异步任务、后台线程回调等)中保留对视图的引用是不好的做法。我相信在ViewModels中有一个特定的lint检查来防止视图被保留


3) 4)5)不要导入活动本身,但不是因为内存泄漏的原因。理想情况下,视图应该只观察ViewModels。让ViewModels响应事件时,请看这一点。如果您需要调用活动方法,请记住您的活动也可以观察ViewModels。

我认为您应该查看从数据绑定库生成的源代码-此xml只是编译时生成的源代码的抽象。我会避免使用任何Android类,尤其是
活动
参考。ViewModel不应该直接引用视图,因此数据绑定与MVP不同。ViewModel的生命周期比
活动的实例要长
-
ViewModel::onCleared
仅在未重新创建
活动时调用(配置更改)我想您应该看看从数据绑定库生成的源代码——这个xml只是编译时生成的源代码的抽象。我会避免使用任何Android类,尤其是
活动
参考。ViewModel不应该直接引用视图,因此数据绑定与MVP不同。ViewModel的生命周期比
活动的实例要长
-
ViewModel::onCleared
仅在
活动
未被重新创建(配置更改)且正在完成时才会调用。感谢您的回答。2.1:没有在VM中声明视图,但只有一个方法可以让它保存引用?还有点击等逻辑去哪里了?也许可以,我从来没有尝试过,但你避免了。ViewModels的作用是保持状态。视图将观察ViewModels中的数据(使用数据绑定),并在数据更改时进行自我更新。至于处理事件,您可以让我们的视图onClick在布局中调用ViewModel中的一个方法来修改数据。而且,由于视图观察模型内部的数据,因此它们会自动更新,而无需显式调用setter方法。看看我链接的代码库,他们就是这么做的。谢谢你的回答。2.1:没有在VM中声明视图,但只有一个方法可以让它保存引用?还有点击等逻辑去哪里了?也许可以,我从来没有尝试过,但你避免了。ViewModels的作用是保持状态。视图将观察ViewModels中的数据(使用数据绑定),并在数据更改时进行自我更新。至于处理事件,您可以在布局中单击我们的视图
<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>