Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在不活动时取消分配LiveData_Android_Performance_Android Architecture Components_Android Livedata - Fatal编程技术网

Android 在不活动时取消分配LiveData

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):

一些背景信息:我正在开发一个应用程序,它依赖于体系结构组件在层之间传递数据,并使用MVVM体系结构

我的存储库有许多函数返回LiveDatas,ViewModel通过转换、视图及其生命周期来观察这些函数

我注意到,当一个活动停止时,观察者被删除,但提供原始LiveData的存储库函数保留在内存中。此外,当发出新请求时,会创建一个全新的对象,因此内存会不断增加

整个GitHub repo位于,其中一个函数是

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中创建可观察的类级别