2011-07-09 24 views
0

我的程序有: 一个活动 按下按钮时执行一项繁重任务(带有许多线程导致10次下载)。 所以当按钮被presed我显示一个进度对话框,我做执行并发线程并在最后结束时通知(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(); 
} 

请告诉我这样做的最好的,更简单的方法?非常感谢

回答

0

您需要参考所有10线程对象。说作为数组Thread [] tasks

因此,您需要调用join()函数来等待(阻塞)线程结束。

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

感谢您的快速回答。但是,如果我在onClick()方法中执行它,它会阻止用户界面的权利?我怎么能避免它? – ChyBy

+0

而不是'onClick()',让它在一个线程中执行。 (pref。AsyncTask) – st0le

0

你可以使用一个CountDownLatchCyclicBarrier

您创建CountDownLatch,并使用您启动的线程数对其进行初始化,然后将其传递到每个下载线程中。当下载线程完成其工作时,它会在锁存器上调用countDown

您可以拨打awaitonClick方法中的锁存器(但是,将阻止该线程,这听起来像你不想做的),或产卵一个额外的线程只是简单地调用await,阻塞等待所有的下载线程。一旦闩锁打开,您可以执行任何需要执行的操作(例如,取消进度对话框)。

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();