在Android 4.0中按顺序执行异步任务

7

我已经实现了两个异步任务,我正在使用Android4.0。其中一个异步任务持续执行,另一个根据需求执行(可能会执行多次)。 例如:

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中获得print消息,但这些消息不是按顺序排列的(像0 2 6 4 10 8 12 14 ...)。
有没有办法连续执行AsynTask1并按顺序执行AsynTask2,以防止出现类似0 2 4 6 8 10 12 14等顺序。
谢谢 &问候 mini.
4个回答

5

使用SERIAL_EXECUTOR来执行异步任务2。

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

编辑: 用于Asynctask1,以便不使用相同的执行器

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

我尝试了这个,但是AsyncTask2没有被执行,所以我无法从AsyncTask2中获取消息。线程池对于所有的异步任务都是相同的吗? - mini
你是只为Asynctask2做了这个,还是同时也为asynctask1做了呢? - nandeesh
好的,我编辑了我的答案。原来普通执行使用串行执行器,所以将AsyncTask1放在线程池执行器上。 - nandeesh
谢谢您的回复,我尝试过了,但是AsynTask2没有被执行。 - mini
1
请在链接中查找SerialExecutor:http://developer.android.com/reference/java/util/concurrent/Executor.html - nandeesh
显示剩余4条评论

0

尝试使用回调函数。在您的AsyncTask类中定义接口,并在主类中实现它们。在AsyncTask2的onPostExecute上使用回调函数来启动下一个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);
    }
}

谢谢您的回复,但我不了解回调函数及其实现。 - mini

0
1. 你不应该像实现AsyncTask1那样,使用AsyncTask来执行长时间运行的线程。请参阅文档:http://developer.android.com/reference/android/os/AsyncTask.html。只需为AsyncTask1所做的操作创建一个单独的线程即可。 2. 由于您需要串行执行AsyncTask2中的操作,因此可以通过创建大小为1的ThreadPool来实现。
// 创建 ThreadPool
ExecutorService service = Executors.newFixedThreadPool(1);

// 提交任务
service.execute(task);

// 不再需要时关闭线程池。
service.shutdown();

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

如果我使用上面的代码,那么每次迭代都会调用AsynTask1,但我不想每次迭代都调用AsynTask1。 - mini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接