#android
#Android
Вопрос:
Я знаю, почему рекомендуется использовать статические обработчики (избегайте утечки памяти во время обработки обработчика). Однако, похоже, что большинство всего, что я прочитал, подразумевает, что это предотвращает утечку приложения / контекста. Весь пример кода имеет Activity или Service в качестве внешнего класса. Например, в этом часто упоминаемом сообщении говорится об утечке контекстов и представлений (http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html ). Он заканчивается цитатой «В чем суть? Избегайте использования нестатических внутренних классов в activity, если экземпляры внутреннего класса переживают жизненный цикл activity. Вместо этого предпочитайте статические внутренние классы и держите слабую ссылку на активность внутри. «
Означает ли это, что можно использовать нестатический обработчик, если класс-владелец не имеет полей для чего-либо, связанного с жизненным циклом Android, и не является Activity / Service / etc.? Я бы так и подумал, но предупреждение Lint не имеет значения, к какому классу относится внешний класс. Я понимаю, что я все еще могу пропустить свой внешний класс и его поля, но, по крайней мере, в моем сценарии это почти ничего не значит.
Ответ №1:
Я бы не сказал, что это нормально, но, возможно, это не так плохо. Контексты — это особенно тяжелая вещь для утечки. Возможно, утечка вашего окружающего класса не так уж и важна. Опять же, это может быть.
По сути, утечки обработчиков происходят, когда сообщения отправляются с задержками. Сообщение содержит ссылку на обработчик, поэтому обработчик остается доступным до тех пор, пока сообщение не будет обработано. И обратите внимание, что даже без явной задержки в очереди циклизатора могут быть другие задачи, которые необходимо выполнить до обработки сообщения, поэтому может быть небольшая задержка. Если контекст (или что-то еще, на что ссылается ваш обработчик) становится недействительным в течение этого времени, это может привести к ошибкам.
Комментарии:
1. Однако, как я могу пропустить контекст? В моем случае внешний класс имеет буквально только два поля (оба массива строк) и ничего не расширяет. Обработчик, конечно, каким-то образом ссылается на контекст, но, если я не ошибаюсь, я не могу избежать утечки самого обработчика, не так ли? Наличие у обработчика ссылки на его внешний класс не влияет на то, протекает ли он; это просто влияет на то, что происходит, когда происходит утечка.
2. Обычный способ, которым обработчики ссылаются на контексты, заключается в том, что они являются нестатическим внутренним классом Activity и, следовательно, имеют неявную ссылку на Activity. Похоже, вы это понимаете. Я не имел в виду, что ваш обработчик обязательно пропустит контекст.