不活动时取消分配LiveData

时间:2018-07-02 16:43:02

标签: android performance android-architecture-components android-livedata

一些背景信息:我正在开发一个依赖体系结构组件在层之间传递数据并使用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的一些屏幕截图,显示了重复的实例。 Screenshot of a duplicated instance Screenshot 2 of a duplicated instance

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

我想念什么?这可能是一个非常琐碎的问题。

谢谢。

==========

编辑:Guide to App Architecture就是这样。

1 个答案:

答案 0 :(得分:1)

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

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

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