可以将视图传递给 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
.
的可见性
当然可以。
如果你使用数据绑定,
你可以使用一个字段来标记视图消失了,
就像您使用“名称”
的方式一样
我知道将视图传递给 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
.
当然可以。 如果你使用数据绑定, 你可以使用一个字段来标记视图消失了, 就像您使用“名称”
的方式一样