2011-07-09 8 views
0

私のプログラムには次のものがあります。 アクティビティ ボタンを押したときに1つの重いタスクが発生します。 ボタンは、私が進捗ダイアログを表示し、私は同時スレッドを実行し、最後に終了したときに通知します。(Android Java)

onClick(){ 
    showDialog(); 
    for (int i=0;i<10;i++) 
     download(i); //download launches a new thread each call 
    //wait without blocking the UI thread until last download end 
     continue(); 
} 

を行うpresedされるようにする場合いただきましたことをやっての最善かつ簡単な方法?あまり前もってありがとう

答えて

0

10スレッドオブジェクトすべてを参照する必要があります。配列として表現すると、join()関数を呼び出して、スレッドが終了するのを待つ(ブロックする)必要があります。

for(int i = 0 ; i < 10; i++) 
     tasks[i].join(); 
+0

ご回答ありがとうございます。しかし、私がonClick()メソッドでそれを行うと、UIが正しくブロックされますか?どうすればそれを避けることができますか? – ChyBy

+0

'onClick()'の代わりに、スレッド内で実行します。 (AsyncTask) – st0le

0

あなたはCountDownLatchまたはCyclicBarrierを使用することができます。

CountDownLatchを作成し、開始するスレッドの数で初期化してから、各ダウンロードスレッドに渡します。ダウンロードスレッドが完了したら、ラッチ上でcountDownを呼び出します。

あなたはonClickメソッド内からラッチをawaitを呼び出すことができますいずれか(それはあなたが行うにはしたくないように聞こえるそのスレッドをブロックします)、または単にawaitを呼び出し、1つの余分のスレッドを生成、待っているのブロッキングすべてのダウンロードスレッド。ラッチが開かれたら、何か必要なアクションを実行することができます(例えば、進捗ダイアログを表示するなど)。

final CountDownLatch latch = new CountDownLatch(10); 
for (int i=0;i<10;i++) 
    download(i, latch); 

Thread cleanup = new Thread(new Runnable() { 
    public void run() { 
     try{ 
      // This will block 
      latch.await(); 
     } catch (InterruptedException e) { 
      // TODO 
      e.printStackTrace(); 
     } 
     takeDownDialog(); 
     whateverElseYouNeedToDo(); 
    } 
}); 
cleanup.start(); 
関連する問題