Нужно ли отменять регистрацию / отмену регистрации ContentObserver в загрузчиках, чтобы избежать утечек памяти
У меня есть много классов загрузчика, который расширяет класс Loader. У меня есть ForceContentObserver в этом классе. Теперь я использую MatrixCursor в некоторых из моих загрузчиков, которые я регистрирую, используя код:
contentResolver.registerContentObserver(uri, true, mObserver);
cursor.registerContentObserver(mObserver);
Нужно ли отменять регистрацию обозревателя контента в загрузчике, когда мой фрагмент / активность приостанавливается, чтобы избежать утечек памяти? В блоге здесь говорится, что наблюдатели контента должны быть незарегистрированными, в противном случае активность / фрагмент не могут быть удалены мусором.
Этот пункт действителен, когда мы передаем контекст активности или когда мы работаем на уровне активности / фрагмента. Но я обнаружил, что Loader внутренне хранит ссылку на объект контекста приложения. Это означает, что шансов утечки памяти нет. Таким образом, весь код регистрации / отмены регистрации наблюдателей действительно необходим?
1 ответ
LoaderManager
фактически будет хранить ограниченный набор загрузчиков (без дубликатов). В то же время, вероятно, стоит отменить регистрацию (несмотря на то, что указатель курсора не делает этого), поскольку наблюдатели хранятся в простом ArrayList (а не в WeakReferences). Лучшее место для этого в Loader.onStopLoading()
(и, возможно Loader.onAbandon()
), так как в этот момент загрузчик не должен предоставлять дальнейшие уведомления об изменениях. LoaderManager
вызовет эти функции в соответствующее время.