Приводит ли эта операция - шаблон сообщений службы к утечке памяти? - PullRequest
4 голосов
/ 19 апреля 2011

У меня есть работник Service и куча занятий. Каждый Activity имеет Handler. Activites может начать работу, отправив Intents на Service с помощью метода startService. Эти задания попадают в очередь и обрабатываются последовательно.

Чтобы сообщить о результатах выполненных заданий, я предоставляю Handler соответствующей операции, завернутый в объект Messenger, с Intent, который описывает задание. Service отправляет обратно некоторое сообщение для вызова Activity через это. Это прекрасно работает.

Но предоставленный Handlers, похоже, остается в памяти, даже после того, как соответствующий Activites был уничтожен, продолжая обрабатывать сообщения о завершении.

  • Как это может быть? Разве обработчики не должны быть уничтожены с Activity частью которого они являются?
  • Это вызывает утечку памяти?

1 Ответ

2 голосов
/ 02 октября 2012

Поскольку у Службы есть ссылка на Itnents, которые все еще имеют ссылку на Обработчик операций, то Обработчик не станет доступным для Сборщика мусора.

Вы видели это видео из Google IO ? Речь идет о создании приложений, использующих веб-сервисы RESTful, поэтому это не имеет прямого отношения, но подход к делегированию ответственности за реагирование на длительные события частично соответствует вашей проблеме.

Если вы не хотите что-то менять слишком сильно, вам нужно, чтобы в вашей деятельности onClose или onDestroy был уведомлен Сервис (и через него Намерение), что долгосрочное задание, за которое он отвечает нужно больше Он удаляет ссылку на обработчик, и GC может от него избавиться.

Это или централизованное управление (как в видео) выполнением задач и реагированием на их жизненный цикл в классе ServiceHelper. Этот класс может публиковать события, когда что-то происходит, и действия могут прослушивать эти события.

Преимущество этого кода в том, что он находится в одном месте, поэтому вам не нужно менять каждое действие, когда вы хотите изменить способ обработки сервиса.

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