首页 > 解决方案 > 在不活动时释放 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 的一些屏幕截图。重复实例的屏幕截图重复实例的屏幕截图 2

在这种特殊情况下,retrieveCode被调用了两次。该函数不仅生成两个单独的 LiveData,它还为每个调用生成两个。

我错过了什么?这可能是一个非常微不足道的问题。

谢谢你。

==========

编辑:这正是应用架构指南的做法。

标签: androidperformanceandroid-architecture-componentsandroid-livedata

解决方案


问题是在观察存储库的 ViewModel 的 Activity 中存在内存泄漏。

内存泄漏是由依赖注入库中的错误引起的。

更多信息在这里。https://github.com/emilioschepis/QRSync/issues/1


推荐阅读