новый обработчик в onCreate ()

Я создаю экземпляр своего обработчика для потока пользовательского интерфейса в одном из методов onCreate () моей Activity. (Чтобы избежать риска утечки памяти, Handler не является внутренним классом, это обычный класс.)

Поскольку один обработчик соответствует одному потоку, но один поток может иметь больше обработчиков (насколько я понимаю), каждый вызов onCreate () создает экземпляр нового обработчика. Поэтому, если моя деятельность будет воссоздана снова (после onDestroy, но без какого-либо уничтожения процесса), onCreate () добавит еще один обработчик, а старый не будет удален. (В исходном коде Android обработчик запрашивает только Thread's Looper и получает ссылку на свою очередь сообщений.)

Какое оптимальное решение? Должен ли я создать экземпляр Handler для статической переменной, а затем в onCreate () я могу проверить, является ли он нулевым или нет. Если он не равен нулю, тогда нет необходимости создавать новый экземпляр, верно?

(Излишне говорить, что в onDestroy () я установил ссылку Activity в моем экземпляре Handler на NULL, поэтому Handler не пропускает Activity или что-либо подобное, а метод обработки моего обработчика проверяет, является ли он нулевым, и при необходимости отбрасывает сообщения . Но мой вопрос в том, что обработчик по-прежнему сохраняется для потока по причинам, подробно описанным в предыдущих абзацах, я полагаю, поэтому чем больше вызовов onCreate, тем больше экземпляров Handler прикреплено к потоку пользовательского интерфейса. Правильно ли мое статическое решение для этого? это не критично, тогда как Android определяет, что обработчик, связанный с текущим потоком, должен быть GC-d?)


person Thomas Calc    schedule 12.05.2012    source источник


Ответы (1)


На обработчик не ссылаются поток, лупер или что-то еще. Обработчик - это просто удобный способ поместить материал в очередь сообщений Looper.

Если вы создаете экземпляр Handler в onCreate () и назначаете его переменной-члену (экземпляру) в вашей деятельности, то когда ваша деятельность собирается сборщиком мусора, Handler также будет сборщиком мусора, потому что на нее нет ничего, что ссылается на нее.

Таким образом, создание объектов Handler в onCreate () не вызовет утечки памяти.

person David Wasser    schedule 15.05.2012