在android4.0中按顺序执行异步任务

时间:2012-08-24 08:29:48

标签: android concurrency android-asynctask

我已经实现了2个asyn任务,我使用的是android4.0。其中一个asyntask连续执行,第二个根据需求执行(可能是多个时间)。 例如。

class AsynTask1 exetends AsyncTask<Void, Bitmap, Void>{
    protected Void doInBackground(Void... params) {
        while(true){
            publishProgress(bmp);
        }
    }
}

class AsynTask2 extends AsyncTask<String, Void,Void>{
    protected Void doInBackground(String... params){
        System.out.println(params[0])
    }
}

在活动课

class MainActivity extends Activity{
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new AsynTask1().execute();

        int i=0;
        while(i<100)
        {
            if(i%2==0)
            new AsynTask2().execute("no is even"+i);
            i++
        }
    }
}     

在上述情况下,不执行AsynTask2。

如果尝试使用executeOnExecutor(AsyncTask.THREAD_POOL_Executor,params),那么两个asyntask都会被执行并且我从AsynTask2获取打印消息,但这些消息没有按顺序排列(如0 2 6 4 10 8 12 14 ... )。

是否有任何方法可以连续执行AsynTask1和顺序执行AsynTask2,以防止顺序(如0 2 4 6 8 10 12 14 ....)。

谢谢&amp;问候 迷你。

4 个答案:

答案 0 :(得分:5)

SERIAL_EXECUTOR用于Asynctask2

 new AsynTask2().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR ,"no is even"+i)

编辑: 用于Asynctask1,因此不使用相同的执行程序

 new AsynTask1().executeOnExecutor(AsyncTask.THREAD_POOL_Executor,params);

答案 1 :(得分:0)

尝试使用回叫。在AsyncTask类中定义接口并在主类中实现它们。使用AsyncTask2的onPostExecute上的callBack启动下一个AsyncTask2。你保证订单。

 class AsyncTask2 extends AsyncTask<String, Void,Boolean<{
        //Your code. doInBackground must now return a boolean.
        protected Void onPostExecute(final Boolean success){
            myCallback listener = (myCallback) parentActivity;
            listener.call();
        }

        public Interface myCallback{
            void call();
        }
 }

然后在您的主要活动中实施myCallback。

[编辑]

以下是您可以做的样本。

Class MainActivity extends Activity implements myCallback{
    //Your code
    public void call(){
       new AsyncTask2().execute("no is even" + i);
    }
}

答案 2 :(得分:0)

  1. 您不应该将AsyncTask用于长时间运行的线程(实现AsyncTask1的方式)。请参阅文档:http://developer.android.com/reference/android/os/AsyncTask.html。只需为AsyncTask1正在创建一个单独的线程。

  2. 由于您需要通过创建大小为1的ThreadPool来完成AsyncTask2中正在执行的操作的串行执行。

    // Creating ThreadPool
    ExecutorService service = Executors.newFixedThreadPool(1);
    
    // Submitting task
    service.execute(task);
    
    // Shutting down the thread pool when not required.
    service.shutdown();
    

答案 3 :(得分:-2)

    int i=0;
    while(i<100)
    {
      new AsynTask1().execute();
        if(i%2==0)
      {
        new AsynTask2().execute("no is even"+i);
       }
        i++
    }