来自 API 文档:
•任务实例必须在 UI 线程上创建。
doInBackground() 在后台线程上运行。所以你不能从 doInBackground() 创建和运行另一个异步任务。
http://developer.android.com/reference/android/os/AsyncTask。查看线程规则下的主题。
当一个异步任务被执行时,该任务会经过 4 个步骤:(直接来自文档)
1.onPreExecute(),在任务执行之前在 UI 线程上调用。此步骤通常用于设置任务,例如通过在用户界面中显示进度条。
2.doInBackground(Params...),在 onPreExecute() 执行完成后立即在后台线程调用。此步骤用于执行可能需要很长时间的后台计算。异步任务的参数传递到这一步。计算的结果必须由这一步返回,并将传递回最后一步。此步骤还可以使用 publishProgress(Progress...) 来发布一个或多个进度单位。这些值在 UI 线程的 onProgressUpdate(Progress...) 步骤中发布。
3.onProgressUpdate(Progress...),在调用 publishProgress(Progress...) 后在 UI 线程上调用。执行的时间是不确定的。此方法用于在后台计算仍在执行时在用户界面中显示任何形式的进度。例如,它可用于动画进度条或在文本字段中显示日志。
4.onPostExecute(Result),在后台计算完成后在 UI 线程上调用。后台计算的结果作为参数传递给这一步。
首次引入时,AsyncTask 是在单个后台线程上串行执行的。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务在单线程上执行,以避免并行执行导致的常见应用程序错误。
如果你真的想要并行执行,你可以使用 THREAD_POOL_EXECUTOR 调用 executeOnExecutor(java.util.concurrent.Executor, Object[])。
您也可以考虑使用替代 RoboSpice。https://github.com/octo-online/robospice。
可以提出多个香料请求。任务完成时在 ui 线程上通知。值得一看 robospice。