@YushkaD
Android Developer

Можно ли создать два AsyncTask'a в одном классе?

Логика с работой с подключениями вынесена в отдельный класс. Уже есть один таск, выполняющий соединение по сети и получение данных определённого типа и формата. Также нужен таск, который будет выполнять загрузку изображений из сети. Можно ли добавить второй таск в этом же классе и стоит ли вообще так делать (насколько это оптимально и логично)? Или предпочтительнее как-то оптимизировать существующий таск для выполнения всех задач?
  • Вопрос задан
  • 526 просмотров
Решения вопроса 2
LeEnot
@LeEnot
Енот-андроид
Вы, конечно, можете добавить сколько угодно AsyncTask'ов в классе, но для загрузки изображений я бы порекомендовал использовать специализированную библиотеку типа Picasso, Glide, UniversalImageLoader или аналогичную.
Какие преимущества вы получаете?
1. Асинхронная загрузка изображений без головной боли
2. Опциональное кеширование изображений - в том числе в RAM и на sdcard
3. Масштабирование и преобразование изображений в thumbnails
4. Еще много всяких приятных мелочей - см. настройки и опции библиотек
Кстати, гугловцы для своих проектов использую Glide, очень много разработчиков используют Picasso - так что в поддержке недостатка не будет.
Ответ написан
enq3
@enq3
Android engineer at #ITX5
Можно. Начиная с версии 1.6 по умолчанию таски выполнялись в пуле потоков, что позволяло запускать несколько тасков параллельно. А вот начиная с версии 3.0 это поведение по умолчанию убрали, чтобы исключить ошибки с параллельным выполнением кода. Если действительно требуется выполнять несколько тасков одновременно, то используем метод executeOnExecutor. Но держим в уме, что при повороте устройства AsyncTask будет пересоздан.
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
    new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
    new MyTask().execute();
}

Не рекомендую использовать IntentService для данной задачи, т.к. IntentService помещает все запросы в очередь и выполняет их по-одному, пока очередь не опустеет.

Посмотрите в сторону Bound Service.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Gregary
Я сталкивался с такой задачей много раз. Для себе решил использовать HaMeR (Handler, Message, Runnable). Вкратце в своих проектах делаю так: создаю Manager (который является наследником от Handler). При каждом запросе (к примеру запрос на загрузку картинки) создаю Thread в котором при окончании работы делаю что-то типа такого
handler_.sendMessage(handler_.obtainMessage(States.REQUEST_COMPLETED, Data));

А потом в Manager'e в методе handleMessage(Message msg) по свитчу решаю что делать дальше. Или обновить UI или сделать еще запрос (при этом запрос может быть уже другой)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы