使用 lifecycle-viewmodel-ktx
和 lifecycle-livedata-ktx
并给出以下示例:
ViewModel 实现:
class AutocompletionViewModel: ViewModel() {
fun getAutocompletion(inputString: CharSequence?) = liveData {
delay(10)
emit("$inputString DUMMY AUTOCOMPLETION")
}
}
fragment 部分 :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
带有 stong 引用的对象 Observer
被创建(并且在 fragment 被销毁之前将一直存在)。尽管如此,一个类似的例子 是 官方文档显示:https://developer.android.com/topic/libraries/architecture/coroutines#livedata
最佳答案
是的,存在内存泄漏:
我附加了 Android Studios 内存分析器并执行了 AutocompletionViewModel.getAutocompletion
一万次。无论垃圾收集如何,Observer
和 LiveData
对象仍然在内存中:
本案结论 :LiveData
对象应该由属性和 Observers
支持应该只附加一次
关于android - 如果 LiveData 没有属性支持,livedata-ktx 与 ViewModel 的使用是否会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59265617/