Android异步任务一个接一个

时间:2014-07-07 07:08:15

标签: android parsing soap android-asynctask download

我有一个现有代码,其中有一个Async Task用于某些请求 - 响应。 在post execute方法中,它将解析后的数据设置为某个db。

现在我需要修改此代码,以便在应用启动时逐个下载数据。 即我需要执行任务A,然后完成任务(即使数据已设置)我需要启动任务B,等等大约12个任务。

注意:我需要完成" post execute"以及在开始下一个任务之前。

我不知道该怎么做。 请建议。

3 个答案:

答案 0 :(得分:5)

您可以使用myAsyncTask.executeOnExecutor (SERIAL_EXECUTOR)

执行此操作
AsyncTask a = new AsyncTask();
AsyncTask b = new AsyncTask();
AsyncTask c = new AsyncTask();

a.executeOnExecutor (SERIAL_EXECUTOR);
b.executeOnExecutor (SERIAL_EXECUTOR);
c.executeOnExecutor (SERIAL_EXECUTOR);

现在执行顺序将是 - > b - > ℃;

答案 1 :(得分:3)

这个有点乱......

使用SERIAL_EXECUTOR配置AsyncTask确实会强制执行后台逻辑, 也就是说,doInBackground()调用中包含的逻辑。

SERIAL_EXECUTOR 不保证何时调用onPostExecute()

在SERIAL_EXECUTOR模式下执行一组AsyncTask可能导致任务A的onPostExecute()被执行 执行之后任务B的doInBackground()。

如果后一个要求对您的系统并不重要,只需使用SERIAL_EXECUTOR即可。


但是,如果是这样,您将需要以强制的方式更改您的架构 这种需求。

这样做的一种方式如下:

class MyAsyncTask<Void, Void, Void> {

        @Override
        protected  Void doInBackground(Void... params) {
            // do background work
            return null;
        }

        @Override
        protected void onPostExecute(Void args) {
            // update UI here
            new MyNextAsyncTask.execute(..); // <---------- start next task only after UI update has completed
        }

}


也就是说:您将等待一个操作的UI更新完成,然后再开始下一个操作。

我可能更喜欢的另一种方法是管理整个任务流程 在内部执行后台任务的单个线程内A - &gt; B - &gt; C .... 并且,在它们之间,发布UI更新命令并在这些上等待ConditionVariable 任务完成

new Thread()  {

     ConditionVariable mCondition = new ConditionVariable(false);
     void run() {

          do_A();

          runonUIThread(updateAfter_A_Runnable);

          mPreviewDone.block(); // will be release after updateAfterA_Runnable completes!


          do_B();

          runonUIThread(updateAfter_B_Runnable);

          mPreviewDone.block(); // will be release after updateAfter_B_Runnable completes!



          etc..
     }

}


希望它有所帮助。

答案 2 :(得分:1)

实施取决于您的要求。

  1. 如果您在每次通话后都需要更新用户界面,则可以在doInBackground()中下载并保存数据,并在onPostExecute()中保存更新。

  2. 如果您只想更新一次用户界面,那么请在doInBackground()内的循环内下载所有数据,并将数据仅保存在数据库中,最后只调用onPostExecute()一次。

  3. 如果它与更新用户界面无关,那么您只需使用Thread

  4. 注意: AsyncTask 执行顺序仅在 HoneyComb 之上是串行的,并且它将是并行的。