Android的异步任务一个接一个(Android Async Task one after ano

2019-10-20 09:56发布

我有一个现有的代码,其具有用于某些请求 - 响应一个异步任务。 在后执行的方法它的解析数据集到一些分贝。

现在我需要以这样的方式,在应用程序启动,得到的数据通过一个下载一个修改此代码。 即我需要执行任务A,然后在它的全面完成(甚至设置数据)我要开始任务B等周边12个任务。

注:我需要完成开始下一个任务之前“后执行”的可能。

我不知道如何做到这一点。 请建议。

Answer 1:

实现取决于您的要求。

  1. 如果每次调用后,你需要更新你的UI,你可以下载并保存在数据doInBackground()并在更新onPostExecute()

  2. 如果你想更新你的UI只是一次,然后下载所有数据的内循环中doInBackground()并保存你的数据在数据库只存在,最后打电话给你onPostExecute()只有一次。

  3. 如果有无关更新UI,那么你可以简单地使用Thread

注: AsyncTask 的执行顺序将只有上述串行 HoneyComb 下方,这将是平行的。



Answer 2:

你可以做到这一点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);

现在exection顺序将是一个 - >乙 - > C。;



Answer 3:

这一次变得有点凌乱..

配置的AsyncTask与SERIAL_EXECUTOR确实会迫使背景逻辑的串行执行 ,也就是逻辑包含在doInBackground()内调用。

SERIAL_EXECUTOR 不作任何保证,而当onPostExecute()将被调用

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

如果是后者的需求是不是你的系统是至关重要的,只要使用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更新开始下一个之前完成。

另一种方式,我可能会更喜欢,是管理日在内部执行ATT后台任务在一个线程中整个任务流程 - “乙 - ”ç....,并在两者之间,问题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..
     }

}


希望能帮助到你。



文章来源: Android Async Task one after another