我要问多个问题,如果不允许,请告诉我我会删除它们,主要问题是......
在哪些情况下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/