android - 如果 LiveData 没有属性支持,livedata-ktx 与 ViewModel 的使用是否会导致内存泄漏?

标签 android kotlin android-livedata android-viewmodel

使用 lifecycle-viewmodel-ktxlifecycle-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一万次。无论垃圾收集如何,ObserverLiveData对象仍然在内存中:
enter image description here

本案结论 :LiveData对象应该由属性和 Observers 支持应该只附加一次

关于android - 如果 LiveData 没有属性支持,livedata-ktx 与 ViewModel 的使用是否会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59265617/

相关文章:

android - Volley - 在同一个 Activity android 中有多个请求

android - ./gradlew assembleRelease 构建失败,无法找到 com.linkedin.dexmaker :dexmaker:2. 21.0

java - 是否存在类似 Babel 的 Java 编译器?

kotlin - 为什么我得到信息 Enum 参数在 Java 中可以为空,但在 Kotlin 中不包含空分支时却是详尽无遗的?

android - 从不同的 LiveData 源填充适配器

java - Android 更改 XML 布局 更改数据字段

android - Eclipse 图形布局无法显示 adView

android - Kotlin - RecyclerView 项目中的 BottomNavigation- android.view.InflateException : Binary XML file line #91: Error inflating class

java - 为什么以及何时将 @JvmStatic 与伴随对象一起使用?

android - 如何在用户输入后过滤 Android MVVM 架构中的 LiveData?