Подтвердить что ты не робот

Утечка памяти в прослушивателе событий

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Не абстрактно, нет.