Android 在不活动时取消分配LiveData
一些背景信息:我正在开发一个应用程序,它依赖于体系结构组件在层之间传递数据,并使用MVVM体系结构 我的存储库有许多函数返回LiveDatas,ViewModel通过转换、视图及其生命周期来观察这些函数 我注意到,当一个活动停止时,观察者被删除,但提供原始LiveData的存储库函数保留在内存中。此外,当发出新请求时,会创建一个全新的对象,因此内存会不断增加 整个GitHub repo位于,其中一个函数是Android 在不活动时取消分配LiveData,android,performance,android-architecture-components,android-livedata,Android,Performance,Android Architecture Components,Android Livedata,一些背景信息:我正在开发一个应用程序,它依赖于体系结构组件在层之间传递数据,并使用MVVM体系结构 我的存储库有许多函数返回LiveDatas,ViewModel通过转换、视图及其生命周期来观察这些函数 我注意到,当一个活动停止时,观察者被删除,但提供原始LiveData的存储库函数保留在内存中。此外,当发出新请求时,会创建一个全新的对象,因此内存会不断增加 整个GitHub repo位于,其中一个函数是 override fun retrieveCode(id: String):
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
}
覆盖检索代码(id:String):
实时数据{
val codeReference=codesReference.document(id)
val observable=MutableLiveData()
codeReference.addSnapshotListener{快照,异常->
if(异常!=null){
//发生了一个错误。
val error=QSError.fromException(异常)
observable.postValue(error.left())
}否则{
//详细信息不能为空,这将
//表示找不到代码。
val detail=snapshot?.toObject(QSCode::class.java)
如果(快照==null | |细节==null){
observable.postValue(QSError.DatabaseError.NotFound.left())
}否则{
observable.postValue(detail.right())
}
}
}
可观测回波
}
我知道该函数每次被调用时都会创建一个新的MutableLiveData,但我不知道如何让它返回相同的,或者至少先清理旧的
下面是Android Profiler的几个屏幕截图,显示了重复的实例
在这种特殊情况下,retrieveCode
被调用两次。该函数不仅生成两个独立的LiveData,而且为每个调用生成两个LiveData
我错过了什么?这可能是一个很小的问题
多谢各位
==========
编辑:这正是如何做到的。问题在于观察存储库的ViewModel的活动中存在内存泄漏 内存泄漏是由依赖项注入库中的错误引起的
更多信息请点击这里 您是否尝试在VM中创建可观察的类级别