Слушатели создают утечки памяти, если не удалены из разрушенного действия? - PullRequest
6 голосов
/ 09 марта 2011

Если вы добавите слушателя к элементу управления / представлению и не удалите его, это создаст утечку памяти?Например, onCreate добавляет слушателя к EditText, который слушает изменения.Вам нужно удалить этот слушатель в onDestroy?

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

Единственный способ увидеть потенциальную утечку памяти - это передать слушателя в объект намерения.Мысли?

Ответы [ 2 ]

8 голосов
/ 09 марта 2011

Сами слушатели не создают утечку памяти. Однако они часто используются ненадлежащим образом и могут привести к утечкам. Иногда вы видите код, где объект ссылается на Компонент (например, для отображения там сообщений), у которого есть слушатель, который ссылается (возможно, косвенно) на первый объект. Это формирует цикл, и все его члены живут и умирают вместе. Когда Компонент является диалогом, который должен быть недолговечным, у вас могут возникнуть проблемы. Начинающие склонны использовать такие объекты, как

class MyKitchenSink implements Runnable, KeyListener, ....

, который может иметь много ссылок и облегчает утечку памяти *. Не создавать "универсальные классы" - это путь.


* Это не «настоящая» утечка памяти, как в C, поскольку все объекты остаются доступными и могут быть использованы, если вы захотите. Это просто делает объект доступным гораздо дольше, чем ожидалось, что пожирает вашу память, как утечку.

3 голосов
/ 09 марта 2011

Утечка памяти не должна создаваться, если что-то кроме элемента управления / представления не ссылается на слушателя - нет необходимости удалять слушателя в onDestroy ...

...