我最近通过SO查找了答案to the same question here,但没有针对此问题的答案。但基本上我想在另一个AsyncTask
的{{1}}方法中运行另一个doInBackground()
。这是一种不好的方法和/或是否会留下任何潜在的副作用?
我知道在AsyncTask
中运行它并且从过去的经验到目前为止我没有遇到任何问题,因为onPostExecute()
在主线程上运行了{{1}开头。
答案 0 :(得分:4)
来自API文档:
•必须在UI线程上创建任务实例。
doInBackground()在后台线程上运行。所以你不能从doInBackground()创建和运行另一个asynctask。
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线程上调用。后台计算的结果作为参数传递给此步骤。
首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。
如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。
您也可以考虑使用替代RoboSpice 。https://github.com/octo-online/robospice。
可以制作多个spice请求。任务完成时,ui线程上的notitifes。值得看看robospice。
答案 1 :(得分:1)
AsyncTask()以串行方式执行。所以,不,你不能从doInBackground()中执行另一个AsyncTask() - 我想我应该说我从来没有尝试过,但是你很可能不会达到预期的效果。
我在其中一个Google Office Hours期间询问了AsyncTask()的执行情况。当被问及“为什么它从串行变为并行并返回到串行执行?”时,它们会直接从嘴里出来? “因为它打破了很多东西。”