Отмена выделения LiveData при неактивности - PullRequest
0 голосов
/ 02 июля 2018

Некоторая справочная информация: я разрабатываю приложение, которое использует компоненты архитектуры для передачи данных между слоями и использует архитектуру MVVM.

В моих репозиториях есть ряд функций, которые возвращают LiveDatas и наблюдаются ViewModel через преобразования, а затем в Views и их жизненных циклах.

Что я заметил, так это то, что когда действие останавливается, наблюдатель удаляется, но функция хранилища, предоставившая исходные данные 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, показывающих дублированные экземпляры. Screenshot of a duplicated instanceScreenshot 2 of a duplicated instance

В этом конкретном случае retrieveCode вызывается дважды. Функция генерирует не только две отдельные LiveDatas, но и две для каждого вызова.

Что мне не хватает? Это может быть очень тривиальной проблемой.

Спасибо.

==========

РЕДАКТИРОВАТЬ: Это именно то, как Руководство по архитектуре приложения делает это.

1 Ответ

0 голосов
/ 02 июля 2018

Проблема заключалась в утечке памяти в Activity, наблюдающей за ViewModel, которая наблюдала хранилище.

Утечка памяти была вызвана ошибкой в ​​библиотеке внедрения зависимостей.

Подробнее здесь. https://github.com/emilioschepis/QRSync/issues/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...