可以将视图传递给 AndroidViewModel 吗

Is it okay to pass views into AndroidViewModel

我知道将视图传递给 ViewModel classes 会导致内存泄漏,但如果我将视图(比方说 ProgressBar)传递给 AndroidViewModel class 也会导致内存泄漏,例如正在关注?

class MainActivityViewModel (application: Application, progressBar: ProgressBar): AndroidViewModel(application) {
    var name: LiveData<String> = Transformations.map(docRef) {
        progressBar.visibility = View.GONE
        it.getString("string")
    }
}

我将使用数据绑定从我的布局文件中调用 name,例如 android:text="@{viewModel.name]"

上面的代码会不会造成内存泄露?

Will the above code cause a memory leak?

是,如果设备进行配置更改,例如用户旋转屏幕。

在这种情况下,您的 activity 及其视图将被销毁并重新创建,但您的 MainActivityViewModel 将被保留并提供给新的 activity 实例。但是,它仍将持有旧 activity 对 progressBar 的引用。这意味着:

  • Android 无法对旧的 activity 进行垃圾回收,因为您的视图模型持有对 activity[= 中的 View 的引用18=]

  • 调用 progressBar 最好的情况下不会有任何效果,最坏的情况下会崩溃(例如,NullPointerException),因为该视图未被活动的 activity

相反,让您正在观察 name 的代码处理更改此 progressBar.

的可见性

当然可以。 如果你使用数据绑定, 你可以使用一个字段来标记视图消失了, 就像您使用“名称”

的方式一样