Утечка памяти в слушателе событий - PullRequest
27 голосов
/ 15 февраля 2011

Я просмотрел статью http://android -developers.blogspot.com / 2009/01 / avoiding-memory-leaks.html . В этой статье предлагается использовать статический внутренний класс с WeakReference. Многие внутренние классы используются для прослушивателей событий. Могут ли эти внутренние классы вызвать утечку памяти? Должны ли эти внутренние классы быть статическими?

1 Ответ

39 голосов
/ 16 февраля 2011

Могут ли эти внутренние классы также вызвать утечку памяти?

Возможно.Это зависит от того, на что зарегистрированы эти слушатели.

Например, хорошо написанное OnClickListener для Button не должно приводить к утечке памяти, потому что даже если OnClickListener может быть внутреннимкласса и имеют неявную ссылку на Activity, весь набор объектов просто привязан к действию.Следовательно, когда действие уничтожено, действие Button и OnClickListener может быть полностью собрано для сбора мусора.

Однако LocationListener, зарегистрированный в системной службе LocationManager, проводится процессом.Следовательно, даже если действие будет уничтожено, слушатель останется зарегистрированным.Если этот слушатель является внутренним классом, он будет продолжать содержать неявную ссылку на действие, и у вас будет утечка памяти.

Должны ли эти внутренние классы быть Staic one?

Возможно.В большинстве случаев правильный ответ - «если вы регистрируете слушателя, отличного от пользовательского интерфейса, обязательно отмените его регистрацию в соответствующем месте».В этом случае утечки не будет.

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

Не в аннотации№ 1029 *

...