具有顺序执行的多个AsyncTasks

时间:2014-01-16 15:11:03

标签: android android-asynctask

我知道之前已经提出了类似的问题,但这些问题的解决方案对我不起作用。情况是我有一个对象数组,每个对象都被发送到asynctask上传到服务器。我需要单独发送每个对象,但列表中的每个对象使用相同的asynctask,因此在onPostExecute()中调用task.execute不是一个选项,因为这会导致它无限地调用自身。我尝试了类似的东西

for(each item in list){
    task.execute();
    while(task.getStatus() != android.os.AsyncTask.Status.FINISHED){
            //spin here and wait
    }
}

但是当这样做时它只是永远旋转而永远不会离开while循环。 任何建议都非常感谢

5 个答案:

答案 0 :(得分:6)

来自AsyncTask docs:

  

从HONEYCOMB开始,任务在单个线程上执行,以避免因并行执行而导致的常见应用程序错误。

所以如果你不是> = HONEYCOMB,那么可能会切换到使用ExecutorService:

ExecutorService executor = Executors.newSingleThreadExecutor();

答案 1 :(得分:3)

为什么不更改您的架构:上传异步任务需要上传一系列文件并循环播放它们?

如果您真的希望保持这种状态,只需使用lock对象即可 类似的东西:

class MyAsyncClass extends AsyncTask{
   static Object lock = new Object();
   .......
   void doWork(){
   synchronized(lock) {
            //do stuff
        }
    }
}

编辑:我应该指出,确保您按顺序执行doWork()方法,并调用它们。

答案 2 :(得分:1)

我建议您切换到Thread并Executor service来执行此操作。这将使您更好地掌握顺序执行和并行执行任务之间的切换。

在ExecutorService(实际上是一个Threadpool管理器)的帮助下。

  • 您可以将任务作为runnable传递给executor服务。
  • 您可以定义执行程序服务使用的线程数(对于您的情况,将其设置为1)。

示例:

ExecutorService service = Executors.newFixedThreadPool(1);
    service.submit(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub

        }
    });

您可以向此提交尽可能多的runnable,并且由于线程数为1,它将按顺序执行。

要与UI通信,您可以使用Handler。

答案 3 :(得分:0)

public void onPostExecute(){if(blahblah){
task.execute();
}
}

AKA在task.execute上放置了一条if语句,因此你可以控制..

答案 4 :(得分:0)

你可以考虑使用IntentService而不是AsyncTask - 因为启动多个意图到同一个IntentService会排队操作,所以之前启动的Intent会有在第二个onHandleIntent(Intent)运行之前完成。