一些背景信息:我正在开发一个依赖体系结构组件在层之间传递数据并使用MVVM体系结构的应用程序。
我的存储库具有许多返回LiveDatas的函数,ViewModel会通过Transformations进行观察,然后再通过Views及其生命周期进行观察。
我注意到的是,当一个Activity停止时,观察者将被删除,但是提供原始LiveData的存储库功能仍保留在内存中。此外,当发出新请求时,会创建一个全新的对象,因此内存不断增加。
整个GitHub存储库位于this link,特别是其中一个功能是
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,而且还会为每个调用生成两个。
我想念什么?这可能是一个非常琐碎的问题。
谢谢。
==========
编辑:Guide to App Architecture就是这样。
答案 0 :(得分:1)
问题是Activity在观察观察存储库的ViewModel时发生内存泄漏。
内存泄漏是由依赖项注入库中的错误引起的。