多个AsyncTask的onPostExecute命令

时间:2013-07-05 13:00:31

标签: java android android-asynctask

首先,对不起英语不好意思。我有android 2.3,所以有“Real”并行AsyncTask而不是顺序执行(android 3.0及更高版本)。 我有几个AsyncTasks,每个都执行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. 中断
  3. processResult2()等到processResult1()结束

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

首先“所以有”真实“”是错误的。在更高版本的android上可以使用所谓的“真正的”async taks而不需要太多的技巧,你只需要以默认的方式调用它就可以调用它。

答案 2 :(得分:0)

阅读本文:(从android docs here复制):

  

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

     

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

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

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

现在我想你要问的那部分:

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

然而,由于它是一个线程,因此无法同时在GUI线程上执行两个任务。一个AyncTask可以抛出一个标志,以防止其他一些AsyncTask在完成后执行其GUI更新,但由于任务应该在GUI线程上短暂存在,这将是一个糟糕的方法。