Android: рекомендации AsyncTask: частный класс или публичный класс?

В настоящее время я разрабатываю несколько приложений для Android в команде, и за последние месяцы мы использовали 2 разных подхода (один, который предпочитает я лично, и другой, который предпочитает другой разработчик).

Хотя пока результаты одинаковы, это заставило меня задуматься... должны ли мы:

  • используйте AsyncTasks как частные классы внутри действий, которые их используют.
  • или используйте AsyncTasks как отдельные общедоступные классы, которые получают контекст активности

Есть ли какие-либо подходы, рекомендованные Google?

Что говорит об этом ваш опыт (преимущества, недостатки, проблемы)?


person neteinstein    schedule 28.01.2011    source источник


Ответы (2)


Внутренние классы хороши для представления объектов, которые должны быть закрытыми или как-то тесно связаны с окружающим классом. Иногда существуют технические причины для использования внутренних классов (например, имитация замыканий). Они также сокращают загрязнение пространства имен.

Одним из недостатков внутренних классов является то, что если они обращаются к закрытым членам (полям или функциям) окружающего класса, компилятор будет генерировать функции доступа к этим членам. Сторонники чистоты языка будут спорить, является ли нарушение инкапсуляции хорошим или плохим. Функции доступа добавляют немного накладных расходов к каждому доступу (что обычно не является фактором, но это так). Другим недостатком является то, что это делает исходный файл более сложным и, следовательно, более сложным в управлении. (Меня иногда раздражало, редактируя функцию во внутреннем классе, думая, что она находится во внешнем классе, и наоборот.) Наконец, внутренние классы, как правило, не допускают повторного использования, в то время как отдельные классы часто могут быть параметризованы для многократного использования. .

Эти плюсы и минусы не приходят мне в голову. Я уверен, что у других будут дополнительные мысли.

ОБНОВЛЕНИЕ:

В этом видео Google IO внутренний параметр AsyncTask явно помечен как неправильный.

person Ted Hopp    schedule 28.01.2011
comment
Через некоторое время, используя их как отдельные общедоступные классы, я вижу, что это гораздо полезнее. - person neteinstein; 14.12.2011
comment
@NeTeInStEiN - для AsyncTask внутренний класс (по сравнению с вложенным статическим классом) всегда неверен по техническим причинам: действие можно отключить (например, из-за изменения конфигурации) без остановки AsyncTask. Если бы AsyncTask был внутренним классом, это привело бы к утечке старой Activity, потому что AsyncTask имел бы (скрытую) ссылку на экземпляр внешнего класса. Несколько изменений ориентации телефона могут привести к остановке процесса из-за нехватки памяти. - person Ted Hopp; 27.01.2012

Это не имеет значения, используйте то, что имеет смысл для вашего кода. Важно следить за асинхронной задачей, которая содержит ссылку на действие после того, как действие было уничтожено, либо неявно как внутренний класс действия, либо явно, получая объект действия/контекста.

person hackbod    schedule 28.01.2011
comment
См. это обсуждение для решения (очень распространенного) проблема AsyncTask, содержащая ссылку на действие. - person Ted Hopp; 11.11.2011