2016-05-19 4 views
1

Я беру класс Android, в котором приложение использует Realm db, а для результата асинхронного запроса добавляется ChangeListener. Документация указывает, что слушатель должен быть добавлен в onStart и удален в onStop, чтобы память не просочилась, если экземпляр был уничтожен. Конфигурация db и экземпляр по умолчанию объявляются в классе, который расширяет Application - поэтому экземпляр Realm db по умолчанию будет сохраняться, но будет ли результат запроса? И если результат запроса не сохраняется, почему нужно удалить слушателя из результата, тогда как с помощью onClickListener (например), этот прослушиватель не нужно удалять?Realm db ChangeListener persistence - утечка памяти

ответ

1

Я не знаю, внутренностей Realm, но давайте использовать вычет =)

Применение одноэлементно (один экземпляр объекта, который будет жить до тех пор, как приложение).

Realm db instance as member будет жить с объектом приложения.

Абонент, например Activity, подписывается на результаты (шаблон наблюдателя - «эй, пинг меня, когда есть что-то для меня»). Когда действие добавляет себя в качестве слушателя, оно дает ссылку. Таким образом, сборщик мусора не может извлечь активность после изменения конфигурации (например, вращения устройства).

onStop - это обратный вызов, который указывает на возможное уничтожение Activity, поэтому он должен отказаться от подписки («не держите меня»).

1

зависит от цели. Если вы добавите RealmChangeListener в RealmResults, слушатель будет GCed после того, как Realm обнаружит, что RealmResults GCed - Realm удерживает слабую ссылку на RealmResults и проверяет слабый ref в какой-то момент. Если RealmChangeListener добавлен к Realm, он будет удален, если экземпляр Realm закрыт или вызывает removeChangeListener/removeAllChangeListeners. В этом случае, если вы держите экземпляр Realm в жизненном цикле приложения и не удаляете прослушиватели вручную, он будет просочиться.

В общем, было бы хорошей практикой удалить их, если они больше не нужны, чтобы не тратить ресурсы процессора/памяти.

+0

Вы можете определить GCed, пожалуйста? – JaeW

+0

Мусор собрал. Пожалуйста, не обращайте внимания на предыдущий вопрос. – JaeW

Смежные вопросы