Могут ли эти внутренние классы также вызвать утечку памяти?
Возможно.Это зависит от того, на что зарегистрированы эти слушатели.
Например, хорошо написанное OnClickListener
для Button
не должно приводить к утечке памяти, потому что даже если OnClickListener
может быть внутреннимкласса и имеют неявную ссылку на Activity
, весь набор объектов просто привязан к действию.Следовательно, когда действие уничтожено, действие Button
и OnClickListener
может быть полностью собрано для сбора мусора.
Однако LocationListener
, зарегистрированный в системной службе LocationManager
, проводится процессом.Следовательно, даже если действие будет уничтожено, слушатель останется зарегистрированным.Если этот слушатель является внутренним классом, он будет продолжать содержать неявную ссылку на действие, и у вас будет утечка памяти.
Должны ли эти внутренние классы быть Staic one?
Возможно.В большинстве случаев правильный ответ - «если вы регистрируете слушателя, отличного от пользовательского интерфейса, обязательно отмените его регистрацию в соответствующем месте».В этом случае утечки не будет.
Может ли кто-нибудь дать мне пример кода о том, как слушатель событий может использовать герметично.
Не в аннотации№ 1029 *