如果 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-ktxlifecycle-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 次。无论是否进行垃圾回收,ObserverLiveData 对象仍保留在内存中:

此案例的结论LiveData 对象应由 属性 支持并且 Observers 应仅附加一次

你不能称之为内存泄漏,你可以称之为糟糕的设计或这种模式的缺点。

但这不是内存泄漏的一种。

以下操作可能会导致内存泄漏:

在应用程序生命周期或静态 'companion' 对象或单例中分配 activity 或片段或侦听器引用。

有关更多信息,请查看此 article