«Если обработчик использует Looper или MessageQueue для потока, отличного от основного потока, тогда проблемы нет».

#android #multithreading #memory-leaks #handler #android-handler

#Android #многопоточности #утечки памяти #обработчик #android-обработчика

Вопрос:

Нестатический внутренний Handler класс в Android Studio показывает предупреждение об утечке памяти. Существует множество существующих тем, которые охватывают этот вопрос и причину этого предупреждения.

Однако мне явно интересно о подчеркнутом предложении:

MainActivity

Это неверно, не так ли? Когда Handler он связан с не-пользовательским thread интерфейсом, но у него есть ссылка на действие, я все еще пропускаю действие.

Комментарии:

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

2. @MarkKeen Очень хороший момент, спасибо.

3. @MarkKeen Если обработчик является нестатическим внутренним классом самого класса Thread, утечки памяти не должно быть, верно?

4. Это зависит от того, является Thread ли сам класс верхнего уровня? Если время жизни Handler совпадает Thread , то нет. Просто будьте осторожны с областью действия Handler ссылки — сильные ссылки на Handler будут Thread препятствовать сборке мусора. Опять же, это зависит от времени жизни объектов, содержащих ссылку..

5. Если оба Thread и Handler недоступны для каких-либо других сильных ссылок, тогда нет, все в порядке.