2013-05-31 282 views
3

我有兩個asyc任務都執行單獨的網絡操作。我想要一個異步任務等待其他任務完成一個變量..我想這樣做就像執行其他任務第一個,但對於一個變量,我必須讓其他的任務要等待第一個完成... ASYC操作onPostexecute有沒有達到efficently enter image description hereAndroid異步任務等待其他任務完成

+1

您的想法是正確的。請您嘗試過。? – Riser

+0

現在我的執行是李克,但只有...我不得不推遲一個大的任務爲單變量 – paul

+0

看看我的意思是這樣的圖片 – paul

回答

3

參照this,您不能使用.execute()so;

首先,你必須要對你的任務是這樣的:

// Start first task 
new Task1().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ""); 
// Start second task 
new Task2().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ""); 

,然後你可以做一個靜態變量,因此這兩個任務都可以訪問到它:

public static boolean task1Finished = false; 

那麼簡單的例子任務:

首要任務

private class Task1 extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     Log.d("myApp", "Task1 started"); 

     for(int x = 0; x < 10; ++x) 
     { 
      try 
      { 
       Thread.sleep(1000); 
       //Log.d("myApp", "sleeped 1000 ms"); 
      } 
      catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
     return ""; 
    } 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // Lets the second task to know that first has finished 
     task1Finished = true; 
    } 
} 

第二個任務

private class Task2 extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     Log.d("myApp", "Task2 started"); 
     while(task1Finished == false) 
     { 
      try 
      { 
       Log.d("myApp", "Waiting for Task1"); 
       Thread.sleep(1000); 
      } 
      catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 

     Log.d("myApp", "Task1 finished"); 
     // Do what ever you like 
     // ... 
     return ""; 
    } 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     Log.d("myApp", "All done here (Task2)"); 
    } 
} 
0

您需要創建第一個如果onpostExecute另一個異步你需要同步調用另一個。

4

可能的AsyncTask是不是最好的工具?還有一些有趣的課程在Android的API,可以幫助專門做同步作業:在Android developper

引用:「四個類可協助常見的專用同步成語

  • 信號燈是一個經典的併發。工具。

  • CountDownLatch是用於阻擋直到信號,事件或條件成立的給定數目的非常簡單但很常見的實用程序。

  • 甲的CyclicBarrier是resetta可用於某些並行編程風格的多路同步點。
  • 的一交換機允許兩個線程在集合點交換對象,它在多流水線設計中是有用的「

所以我建議尋找到:

循環障礙 http://developer.android.com/reference/java/util/concurrent/CyclicBarrier.html

http://developer.android.com/reference/java/util/concurrent/Exchanger.html