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

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

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

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

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

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

Ответ 1

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

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

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

ОБНОВЛЕНИЕ:

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

Ответ 2

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