2014-01-16 88 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。