Я просмотрел статью http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html. В этой статье предлагается использовать статический внутренний класс с WeakReference. Многие внутренние классы используются для прослушивателей событий. Может ли этот внутренний класс вызвать утечку памяти? Должны ли эти внутренние классы быть статическими?
Утечка памяти в прослушивателе событий
Ответ 1
Может ли этот внутренний класс вызвать утечку памяти?
Возможно. Это зависит от того, на что зарегистрированы эти слушатели.
Например, хорошо написанный OnClickListener
для Button
не должен приводить к утечке памяти, потому что хотя OnClickListener
может быть внутренним классом и иметь неявную ссылку на Activity
, весь набор объектов все привязан к активности. Следовательно, когда активность уничтожается, активность, Button
и OnClickListener
может быть собрана в виде мусора в целом.
Тем не менее, a LocationListener
, зарегистрированный в системной службе LocationManager
, удерживается процессом. Следовательно, даже если действие будет уничтожено, слушатель останется зарегистрированным. Если этот слушатель является внутренним классом, он будет продолжать удерживать неявную ссылку на активность, и у вас будет утечка памяти.
Должен ли этот внутренний класс быть Staic одним?
Возможно. В большинстве случаев правильным ответом является "если вы регистрируете слушателя, кроме как с пользовательским интерфейсом, обязательно отмените регистрацию в соответствующей точке". В этом случае утечки не будет.
Может ли кто-нибудь дать мне какой-нибудь пример кода, как прослушиватель событий может использовать утечку.
Не абстрактно, нет.