2014-01-16 59 views
2

我知道类似的问题之前已经被问到过,但这些问题的解决方案对我来说并不适用。情况是我有一个对象的数组,每个对象都通过一个asynctask发送到服务器。我需要分别发送每个对象,但列表中的每个对象都使用相同的asynctask,因此在onPostExecute()中调用task.execute不是一个选项,因为这会导致它无限地调用自身。我试过类似的东西顺序执行多个AsyncTasks

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

但是,当这样做时,它只是旋转永远不会离开while循环。 任何建议不胜感激

回答

6

来自的AsyncTask文档:

与蜂窝开始,任务是在单个线程中执行,以避免由并行执行常见的应用错误。

,所以如果你不> =蜂窝,那么也许切换使用的ExecutorService:

ExecutorService executor = Executors.newSingleThreadExecutor(); 
+0

所以,如果我比蜂窝大,如果我打电话会发生什么。 task.execute(); task.execute(); – KBusc

+0

它将从文档中再次执行,API> = 11:SERIAL_EXECUTOR是默认值:'执行程序按顺序执行一个任务。这个序列化对于一个特定的过程是全球性的。 ' – marcinj

+0

好吧我会试试这个 – KBusc

3

为什么你不改变你的架构:使上传异步任务需要上传一个文件数组,并通过它们循环?

如果你真的想保持这种方式,只需使用lock对象。
喜欢的东西:

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

编辑:我要指出的是,这并没有确保你,那doWork()方法在顺序执行,他们被称为。

+0

并锁定阵列? – KBusc

+0

不是数组,定义类似'Object lockProvider;'的东西不会做任何事情,它只会作为您锁定的对象。 –

+0

哦好吧,然后在onPostexecute()中解锁它? – KBusc

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

AKA把if语句上task.execute所以你必须控制..

0

您可以使用IntentService而不是AsyncTask - 因为向同一个IntentService启动多个意向会排队操作,因此之前启动的Intent将不得不compil在第二个onHandleIntent(Intent)之前的lete将会运行。

1

我建议你切换到Thread和Executor service来做到这一点。这将使您更好地在顺序执行和并行执行任务之间切换。

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

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

例子:

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

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

     } 
    }); 

你可以尽可能多的可运行提交到这一点,因为线程数为1,它会被顺序执行。

对于与UI进行通信,您可以使用Handler。