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

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

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

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

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

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

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

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

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

ОБНОВИТЬ:

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

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