Нужно ли отменять регистрацию / отмену регистрации ContentObserver в загрузчиках, чтобы избежать утечек памяти

У меня есть много классов загрузчика, который расширяет класс Loader. У меня есть ForceContentObserver в этом классе. Теперь я использую MatrixCursor в некоторых из моих загрузчиков, которые я регистрирую, используя код:

contentResolver.registerContentObserver(uri, true, mObserver);
cursor.registerContentObserver(mObserver);

Нужно ли отменять регистрацию обозревателя контента в загрузчике, когда мой фрагмент / активность приостанавливается, чтобы избежать утечек памяти? В блоге здесь говорится, что наблюдатели контента должны быть незарегистрированными, в противном случае активность / фрагмент не могут быть удалены мусором.

Этот пункт действителен, когда мы передаем контекст активности или когда мы работаем на уровне активности / фрагмента. Но я обнаружил, что Loader внутренне хранит ссылку на объект контекста приложения. Это означает, что шансов утечки памяти нет. Таким образом, весь код регистрации / отмены регистрации наблюдателей действительно необходим?

1 ответ

LoaderManager фактически будет хранить ограниченный набор загрузчиков (без дубликатов). В то же время, вероятно, стоит отменить регистрацию (несмотря на то, что указатель курсора не делает этого), поскольку наблюдатели хранятся в простом ArrayList (а не в WeakReferences). Лучшее место для этого в Loader.onStopLoading() (и, возможно Loader.onAbandon()), так как в этот момент загрузчик не должен предоставлять дальнейшие уведомления об изменениях. LoaderManager вызовет эти функции в соответствующее время.

Другие вопросы по тегам