gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:42:04 25 4
gpt4 key购买 nike

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

在哪些情况下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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com