我最近通过 SO 在这里找到了相同问题的答案,但没有针对这样做的风险的问题的答案。但基本上我想在 anotherAsyncTask
的doInBackground()
方法中运行 another AsyncTask
。这是一种不好的方法和/或是否会留下任何潜在的副作用?
我知道在onPostExecute()
工作中运行它,到目前为止,从过去的经验来看,我没有遇到任何问题,因为onPostExecute()
它在开始的主线程上运行AsyncTask
。
我最近通过 SO 在这里找到了相同问题的答案,但没有针对这样做的风险的问题的答案。但基本上我想在 anotherAsyncTask
的doInBackground()
方法中运行 another AsyncTask
。这是一种不好的方法和/或是否会留下任何潜在的副作用?
我知道在onPostExecute()
工作中运行它,到目前为止,从过去的经验来看,我没有遇到任何问题,因为onPostExecute()
它在开始的主线程上运行AsyncTask
。
从 API 文档:
• 任务实例必须在 UI 线程上创建。
doInBackground() 在后台线程上运行。所以你不能从 doInBackground() 创建和运行另一个异步任务。
http://developer.android.com/reference/android/os/AsyncTask。查看线程规则下的主题。
执行异步任务时,任务经过 4 个步骤:(直接来自 doc)
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。
AsyncTask(),除了 Honeycomb 版本,串行执行。所以,不,你不能从 doInBackground() 中执行另一个 AsyncTask() ——我想我应该说我从未尝试过,但你不太可能达到预期的效果。
我询问了在 Google 办公时间之一执行 AsyncTask() 的情况。当被问到“为什么它从串行变为并行并返回到串行执行?”时,他们直截了当地说;“因为它弄坏了很多东西。”