0

首先,很抱歉英语不好。我有 android 2.3,所以有“Real”并行 AsyncTask 而不是顺序执行(android 3.0 和更高版本)。我有几个 AsyncTask,每个都执行 onPostExecute() 回调(我知道它将在 UI 线程中执行)。假设我只有 2 个并行 AsyncTask,当第一个任务完成时,回调 onPostExecute() 将被调用。是否有可能,当 onPostExecute()(来自第一个 AsyncTask)方法在 UI 线程上运行时,第二个任务正在调用其 onPostExecute() 方法,从而中断第一个 AsyncTask 的 onPostExecute() 的当前执行?

//更新我现在用代码解释它:

// AsyncTask1
onPostExecute(Result result) {
    activity->processResult1(result);
} 

// AsyncTask2
onPostExecute(Result result) {
    activity->processResult2(result);

假设 AsyncTask1 已经完成了它的工作,并且 processResult1() 是一个运行时间很长的方法:当我们在 UI 线程上执行 processResult1() 时,AsyncTask2 完成了它的工作。现在会发生什么?

  1. processResult1() 将被 processResult2() 中断
  2. processResult2() 等到 processResult1() 结束
4

3 回答 3

2

AsyncTask完成它的doInBackground方法时,它会发布Runnable(执行我们的onPostExecute方法)到 UI 线程。通过“post”,我的意思是存在某种Runnable队列,这意味着那些方法(onPostExecute)将以串行方式(一个接一个)执行。因此,一种onPostExecute方法不能中断另一种方法(当然,如果它已经发布到 UI 线程中)。

于 2013-07-07T17:12:44.383 回答
1

首先“所以有”真实“”是错误的。所谓的“真正的”异步任务在更高版本的 android 上可用,没有太多技巧,您只需要以不同的方式调用它,因为默认方式已更改。

于 2013-07-05T13:04:22.513 回答
0

阅读此内容:(从此处的 android 文档复制):

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

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

如果您执行多个 AsyncTask,如果设备为 DONUT<= device api < HONEYCOMB ,它们将同时运行。这是因为 android 在这些版本中使用多个后台线程来执行 AsyncTasks 而不是单个线程。因此,我假设任务不一定会按照它们启动的顺序在 GUI 线程上执行,因为它们会同时执行。但这是一个有根据的猜测,我不确定。

如果您的设备软件是 < DONUT 或 >= HONEYCOMB,则操作将按照启动顺序发布到 GUI 线程。这是因为在这些版本中,所有 AsyncTask 都将在一个后台线程上执行,因此它们不会独立执行。

现在对于我认为您要问的部分:

在所有版本中,都可以从另一个中取消一个 AsyncTask。但是,在 >=DONUT 和 < HONEYCOMB 版本中,您尝试中断的任务可能已经完成,因为 AsyncTasks 将同时执行。

然而,两个任务不可能同时在 GUI 线程上执行,因为它是一个线程。一个 AyncTask 可能会抛出一个标志来阻止其他一些 AsyncTask 在完成后执行其 GUI 更新,但由于任务应该在 GUI 线程上短暂存在,这将是一种不好的方法。

于 2013-07-07T18:29:25.120 回答