2017-01-05 5 views
6

Мне любопытно, почему ниже происходит утечка памяти, потому что mHandler создается на mainThread, и теперь, когда onDestroy называется wont, он просто убивает поток? как обработчик может существовать после уничтожения активности? я не создал новую нить. Разве я понимаю, что обработчик, если он имеет вещи, в очереди сообщений останется даже после уничтожения потока?Android - могут ли обработчики mainThread вызывать утечки памяти?

Ссылка чтения документ им является here enter image description here

ответ

13

Обработчик в основном используется для публикации событий в MessageQueue Thread. Каждый экземпляр Handler связан с одним потоком и очереди сообщений этого потока.

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

поэтому убедитесь, чтобы удалить все сообщения в OnStop() деятельности по телефону

handler.removeCallbacksAndMessages(null); 

это очистит все ожидающее сообщение и обратные вызовы, прежде чем покинуть вашу деятельность.

+0

так что вы говорите, если у обработчика есть сообщения в очереди, он должен продолжать работать, даже если активность, которую она создала при завершении, правильно? – j2emanue

+0

И в случае моего примера обработчик связан с mainThread. и я отправляю runnables на главный петлитель потоков. теперь, когда активность вызывает onDestroy, поскольку есть сообщения, все еще находящиеся в очереди mainThreads looper, GC не будет собирать активность? или что GC не будет собирать активность из-за ссылки, которую выполняет runnable? Посмотрите, что я имею в виду? Скажем, у runnable нет ссылки на активность? он будет просочиться? – j2emanue

+0

@ j2emanue, если ваш runnable не содержит ссылки на активность, в этом случае утечка активности не произойдет, но основной поток будет активен, так как он должен завершить события в очереди сообщений, отправленные runnable. –

0

Они могут, но не из Handler- в Runnable, размещенной. Способ работы Handler заключается в том, что он связан с Thread. В этой теме должен быть Looper. У Looper есть очередь сообщений. Когда вы postDelayed, вы добавляете Runnable в очередь сообщений Looper. Таким образом, сам поток имеет ссылку на Runnable. Так что Runnable будет утечка, и если нестатический родительский класс будет просочиться.

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

  • Нет связанных вопросов^_^