Некоторая справочная информация: я разрабатываю приложение, которое использует компоненты архитектуры для передачи данных между слоями и использует архитектуру 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, показывающих дублированные экземпляры.
В этом конкретном случае retrieveCode
вызывается дважды. Функция генерирует не только две отдельные LiveDatas, но и две для каждого вызова.
Что мне не хватает? Это может быть очень тривиальной проблемой.
Спасибо.
==========
РЕДАКТИРОВАТЬ: Это именно то, как Руководство по архитектуре приложения делает это.