如果 LiveData 没有 属性 支持,将 livedata-ktx 与 ViewModels 一起使用是否会导致内存泄漏?
Is the usage of livedata-ktx with ViewModels causing memory leaks if the LiveData is not backed by a property?
使用 lifecycle-viewmodel-ktx
和 lifecycle-livedata-ktx
并给出以下示例:
视图模型实现:
class AutocompletionViewModel: ViewModel() {
fun getAutocompletion(inputString: CharSequence?) = liveData {
delay(10)
emit("$inputString DUMMY AUTOCOMPLETION")
}
}
片段部分:
val viewModel by viewModels<AutocompletionViewModel>()
/* Acquiring EditText*/
editText.addTextChangedListener(object: TextWatcher{
override fun afterTextChanged(editable: Editable?) {
viewModel.getAutocompletion(editable).observe(viewLifecycleOwner, Observer { editable?.append(it) })
}
/* Other TextWatcher method implementations*/
})
如果用户在 EditText 中键入文本,此代码是否会导致内存泄漏?
我假设每次更改文本都会创建一个新的 LiveData
对象,其中引用了 Observer
(并且在片段被销毁之前一直存在)。 然而,官方文档显示了一个类似的例子 :https://developer.android.com/topic/libraries/architecture/coroutines#livedata
是,内存泄漏:
我附加了 Android Studio 内存分析器并执行了 AutocompletionViewModel.getAutocompletion
10000 次。无论是否进行垃圾回收,Observer
和 LiveData
对象仍保留在内存中:
此案例的结论:LiveData
对象应由 属性 支持并且 Observers
应仅附加一次
你不能称之为内存泄漏,你可以称之为糟糕的设计或这种模式的缺点。
但这不是内存泄漏的一种。
以下操作可能会导致内存泄漏:
在应用程序生命周期或静态 'companion' 对象或单例中分配 activity 或片段或侦听器引用。
有关更多信息,请查看此 article
使用 lifecycle-viewmodel-ktx
和 lifecycle-livedata-ktx
并给出以下示例:
视图模型实现:
class AutocompletionViewModel: ViewModel() {
fun getAutocompletion(inputString: CharSequence?) = liveData {
delay(10)
emit("$inputString DUMMY AUTOCOMPLETION")
}
}
片段部分:
val viewModel by viewModels<AutocompletionViewModel>()
/* Acquiring EditText*/
editText.addTextChangedListener(object: TextWatcher{
override fun afterTextChanged(editable: Editable?) {
viewModel.getAutocompletion(editable).observe(viewLifecycleOwner, Observer { editable?.append(it) })
}
/* Other TextWatcher method implementations*/
})
如果用户在 EditText 中键入文本,此代码是否会导致内存泄漏?
我假设每次更改文本都会创建一个新的 LiveData
对象,其中引用了 Observer
(并且在片段被销毁之前一直存在)。 然而,官方文档显示了一个类似的例子 :https://developer.android.com/topic/libraries/architecture/coroutines#livedata
是,内存泄漏:
我附加了 Android Studio 内存分析器并执行了 AutocompletionViewModel.getAutocompletion
10000 次。无论是否进行垃圾回收,Observer
和 LiveData
对象仍保留在内存中:
此案例的结论:LiveData
对象应由 属性 支持并且 Observers
应仅附加一次
你不能称之为内存泄漏,你可以称之为糟糕的设计或这种模式的缺点。
但这不是内存泄漏的一种。
以下操作可能会导致内存泄漏:
在应用程序生命周期或静态 'companion' 对象或单例中分配 activity 或片段或侦听器引用。
有关更多信息,请查看此 article