APIドキュメントから:
•タスクインスタンスは、UIスレッドで作成する必要があります。
doInBackground()はバックグラウンドスレッドで実行されます。したがって、doInBackground()から別の非同期タスクを作成して実行することはできません。
http://developer.android.com/reference/android/os/AsyncTask。スレッドルールのトピックをご覧ください。
非同期タスクが実行されると、タスクは4つのステップを経ます:(ドキュメントから直接)
1.onPreExecute()、タスクが実行される前にUIスレッドで呼び出されます。この手順は通常、ユーザーインターフェイスに進行状況バーを表示するなどしてタスクを設定するために使用されます。
2. doInBackground(Params ...)。onPreExecute()の実行が終了した直後にバックグラウンドスレッドで呼び出されます。このステップは、時間がかかる可能性のあるバックグラウンド計算を実行するために使用されます。非同期タスクのパラメーターは、このステップに渡されます。計算の結果はこのステップで返される必要があり、最後のステップに戻されます。このステップでは、publishProgress(Progress ...)を使用して、1つ以上の進行状況を公開することもできます。これらの値は、UIスレッドのonProgressUpdate(Progress ...)ステップで公開されます。
3.onProgressUpdate(Progress ...)、publishProgress(Progress ...)の呼び出し後にUIスレッドで呼び出されます。実行のタイミングは未定義です。このメソッドは、バックグラウンド計算の実行中に、ユーザーインターフェイスであらゆる形式の進行状況を表示するために使用されます。たとえば、プログレスバーをアニメーション化したり、テキストフィールドにログを表示したりするために使用できます。
4.onPostExecute(Result)、バックグラウンド計算が終了した後にUIスレッドで呼び出されます。バックグラウンド計算の結果は、パラメーターとしてこのステップに渡されます。
最初に導入されたとき、AsyncTasksは単一のバックグラウンドスレッドでシリアルに実行されていました。DONUTから、これはスレッドのプールに変更され、複数のタスクを並行して操作できるようになりました。HONEYCOMB以降、並列実行によって引き起こされる一般的なアプリケーションエラーを回避するために、タスクは単一スレッドで実行されます。
本当に並列実行が必要な場合は、THREAD_POOL_EXECUTORを使用してexecuteOnExecutor(java.util.concurrent.Executor、Object [])を呼び出すことができます。
また、代替のRoboSpiceの使用を検討することもできます。https://github.com/octo-online/robospice。
複数のスパイスリクエストを行うことができます。タスクが完了すると、UIスレッドに通知されます。ロボスパイスを見る価値があります。