Последовательное выполнение нескольких AsyncTasks - PullRequest
3 голосов
/ 31 июля 2011

Кто-нибудь знает, как легко организовать несколько вызовов для выполнения AsyncTask в очереди или что-то еще, а затем выполнить их последовательно?

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

Есть идеи, как это решить? Я видел, что в сотовом API есть метод executeOnExecutor() с SERIAL_EXECUTOR, я думаю, он реализует то, что я описал. Тем не менее, я не разрабатываю для сотов.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 31 июля 2011

Вы можете попробовать IntentService.Из ссылки:

IntentService - это базовый класс для служб, которые обрабатывают асинхронные запросы (выраженные в виде содержимого) по требованию.Клиенты отправляют запросы через вызовы startService (Intent);служба запускается по мере необходимости, обрабатывает каждое намерение поочередно, используя рабочий поток, и останавливается, когда заканчивается его работа.

Я запустил службу с приемника вещания следующим образом:

    // Now let the service module do the rest

    Intent serviceIntent = new Intent(context, Service.class);
    serviceIntent.putExtra(GC.EXTRA_SERVICE_DATA, serviceData);
    ComponentName compName = context.startService(serviceIntent)

Работало как рекламируется.Запросы сериализуются нормально.Служба началась, когда был получен запрос.Служба остановлена ​​после обработки последнего запроса.Запросы были обработаны FIFO.

Я создал intentservice, щелкнув правой кнопкой мыши на имени исходного пакета и выбрав New / Class.Я использовал intentservice в качестве суперкласса.У конструктора есть аргумент «имя».Я изменил его на:

    public XxxService() {super("XxxService");}

Весь код службы перешел в функцию onHandleIntent.Мне не приходилось использовать другие функции @Override.

Надеюсь, это то, что вы хотели ...

Примечания: переменная context является переданным параметром в onReceive.Я изменил имена в коде с XxxxService на «Сервис» или «Сервис».Наконец, я создаю класс во всех моих проектах под названием GC.Это контейнерный класс для глобальных констант.GC.EXTRA_SERVICE_DATA - это глобальная строка, определяющая дополнительный ключ.

1 голос
/ 04 декабря 2013

Версии Android, более крупные, чем Honeycomb, сделали исполнителя Asynctask по умолчанию в качестве последовательного исполнителя. Так что если ваш мин. Версия SDK и целевая версия SDK больше 12, Asynctasks будут выполняться в соответствии с вызовом их функции execute. Смотрите мое обсуждение Asynctask на

https://docs.google.com/document/d/1_zihWXAwgTAdJc013-bOLUHPMrjeUBZnDuPkzMxEEj0/edit?usp=sharing

Надеюсь, это поможет вам ...

0 голосов
/ 31 июля 2011

Я хотел бы сделать это следующим образом: иметь массив или очередь или счетчик числа раз, которое вы хотите выполнить AsyncTAsk (один и тот же класс AsyncTask или другой класс) в действии, в AsyncTask, onPostExecute (), уменьшить счетчик (или аналогичная структура данных) и снова вызовите AsyncTask.

...