android - 在不活动时释放 LiveData
问题描述
一些背景信息:我正在开发一个依赖于架构组件在层之间传递数据并使用 MVVM 架构的应用程序。
我的存储库有许多返回 LiveDatas 的函数,并由 ViewModel 通过 Transformations 观察,然后由 Views 及其生命周期观察。
我注意到的是,当一个 Activity 停止时,观察者被删除,但提供原始 LiveData 的存储库函数保留在内存中。此外,当发出新请求时,会创建一个全新的对象,因此内存会不断增加。
整个 GitHub 存储库位于此链接,具体功能之一是
override fun retrieveCode(id: String):
LiveData<Either<QSError, QSCode>> {
val codeReference = codesReference.document(id)
val observable = MutableLiveData<Either<QSError, QSCode>>()
codeReference.addSnapshotListener { snapshot, exception ->
if (exception != null) {
// An error occurred.
val error = QSError.fromException(exception)
observable.postValue(error.left())
} else {
// The detail must not be null, that would
// mean that the code was not found.
val detail = snapshot?.toObject(QSCode::class.java)
if (snapshot == null || detail == null) {
observable.postValue(QSError.DatabaseError.NotFound.left())
} else {
observable.postValue(detail.right())
}
}
}
return observable
}
我知道该函数每次调用时都会创建一个新的 MutableLiveData,但我不知道如何让它返回相同的,或者至少先清理旧的。
以下是显示重复实例的 Android Profiler 的一些屏幕截图。
在这种特殊情况下,retrieveCode
被调用了两次。该函数不仅生成两个单独的 LiveData,它还为每个调用生成两个。
我错过了什么?这可能是一个非常微不足道的问题。
谢谢你。
==========
编辑:这正是应用架构指南的做法。
解决方案
问题是在观察存储库的 ViewModel 的 Activity 中存在内存泄漏。
内存泄漏是由依赖注入库中的错误引起的。
推荐阅读
- windows - 自动打开修改文件的批处理脚本
- mailchimp-api-v3.0 - Mailchimp 日期验证问题 - ISO8601 被拒绝
- symfony4 - 原则 ODM/SF4。1:必须返回结果而不是游标
- javascript - 在 React 中找不到模块
- node.js - 如何将 klaw 与 async/await 一起使用?
- django - 带有 PATCH 请求的 serializer.update 中的 DRF CurrentUserDefault
- java - 使用动态 TCP 端口与 SQL 服务器的 JDBC 连接
- mvvm - MVVM - 自定义模型的 MutableLiveData 没有通过数据绑定更新到 ViewModel 并且始终为空
- elasticsearch - ElasticSearch搜索,获取返回产品的唯一类别
- javascript - 将日期作为字符串写入 Odata 模型 0CALDAY?