在 doInBackground 中创建另一个 AsyncTask

问题描述 投票:0回答:2

我最近通过 SO 在这里找到了同样问题的答案,但是没有针对这样做的风险的问题的答案。但基本上我想在另一个

AsyncTask
doInBackground()
方法中运行另一个
AsyncTask
。这是一种糟糕的方法和/或它是否会留下任何潜在的副作用?

我知道在

onPostExecute()
中运行它是有效的,而且从过去的经验来看,我没有遇到任何问题,因为
onPostExecute()
在主线程上运行,该主线程开始了
AsyncTask

java android asynchronous android-asynctask
2个回答
4
投票

来自 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线程上调用。后台计算结果为 作为参数传递给这一步。

首次引入时,AsyncTasks 在单个后台线程上串行执行。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务在单线程上执行,以避免并行执行导致的常见应用程序错误。

如果你真的想要并行执行,你可以调用 executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR.

您也可以考虑使用 替代的 RoboSpice.https://github.com/octo-online/robospice.

可以提出多种香料要求。任务完成时 ui 线程上的通知。值得一看 robospice.


1
投票

AsyncTask(),除了 Honeycomb 版本,串行执行。所以,不,你不能从 doInBackground() 中执行另一个 AsyncTask()——我想我应该说我从未尝试过,但你不太可能达到预期的效果。

我在某个 Google 办公时间询问了 AsyncTask() 的执行情况。当被问到“为什么从串行执行变为并行执行又变回串行执行?”时直接从他们嘴里说出来? “因为它打破了很多东西。”

© www.soinside.com 2019 - 2024. All rights reserved.