Из API Docs:
• Экземпляр задачи должны быть созданы в потоке пользовательского интерфейса.
doInBackground() работает на фоне потока. Таким образом, вы не можете создавать и запускать другую асинтезу из doInBackground().
http://developer.android.com/reference/android/os/AsyncTask. Взгляните на тему под правилами .
Когда асинхронная задача выполняется, задача проходит через 4 этапа: (прямой от Doc)
1.onPreExecute(), вызывается в потоке пользовательского интерфейса, прежде чем задача будет выполнена. Этот шаг обычно используется для настройки задачи, например, показывая индикатор выполнения в пользовательском интерфейсе.
2. doInBackground (Params ...), вызывается на фоне потока сразу после onPreExecute() завершает выполнение. Этот шаг используется для выполнения фоновых вычислений, которые могут занять много времени. Параметры асинхронной задачи передаются на этот шаг. Результат вычисления должен быть возвращен этим шагом и будет возвращен на последний шаг. Этот шаг также может использовать publishProgress (Progress ...) для публикации одного или нескольких единиц прогресса. Эти значения публикуются в потоке пользовательского интерфейса на этапе onProgressUpdate (Progress ...).
3.onProgressUpdate (Прогресс ...), вызывается в потоке пользовательского интерфейса после вызова publishProgress (Прогресс ...). Время выполнения не определено. Этот метод используется для отображения любой формы прогресса в пользовательском интерфейсе, пока фоновое вычисление все еще выполняется. Например, его можно использовать для анимации индикатора выполнения или отображения журналов в текстовом поле.
4.onPostExecute (Result), вызывается в потоке пользовательского интерфейса после завершения вычисления фона. Результат вычисления фона передается на этот шаг в качестве параметра.
При первом вводе AsyncTasks выполнялись последовательно на одном фоновом потоке. Начиная с DONUT, это было изменено на пул потоков, позволяющий нескольким задачам работать параллельно. Начиная с HONEYCOMB, задачи выполняются в одном потоке, чтобы избежать ошибок обычного приложения, вызванных параллельным выполнением.
Если вы действительно хотите выполнить параллельное выполнение, вы можете вызвать executeOnExecutor (java.util.concurrent.Executor, Object []) с помощью THREAD_POOL_EXECUTOR.
Также вы можете использовать альтернативный RoboSpice. https://github.com/octo-online/robospice.
Можно сделать несколько запросов на пряность. Инициирует поток ui, когда задача завершена. Стоит взглянуть на robospice.
Очень красивый и тщательный ответ вместе с несколькими альтернативами. Еще раз спасибо Raghunandan – JoeyL
+1 за такой исчерпывающий ответ. Мне было интересно прочитать «Класс AsyncTask должен быть загружен в поток пользовательского интерфейса. Это делается автоматически с JELLY_BEAN.' (из документов) - знаете ли вы, что делается автоматически? –
@ Дэвид Каунт проверить ссылку http://stackoverflow.com/questions/14978924/what-is-the-difference-between-loading-and-creating-asynctask-on-the-ui-thread. – Raghunandan