
第十三課:Thread與Handler
本文介紹如何在android中使用thread和handler。當你需要花長時間去做一些工作時,你應該考慮使用一個新建的thread去完成。 Android有一個Application Not Responding (ANR,應用程序沒有回應)的概念。當你的activity幾過5秒也沒回應輸入,或BroadcastReceiver 10秒內也沒完成, ANR dialog便會出現,告訴你這個程序可能有問題,用戶可以選擇強行關閉。
什麼時候會有這樣的情況呢?例如讀寫文件的I/O,database查詢,網頁下載等,都存在很大不確定性,很多時候都會花很長的時間完成。我們應該盡可能把這些code放在另一條thread中運行,而不是使用主要的main thread(UI thread)。
新增一個名為ThreadHandlerDemo的project,然後在主activity中加上一個start loading的按鈕。當用戶按下時,我們打算在這裡建立一條新的thread,把花時間工作(sleep)交給它。不錯,sleep什麼時候也是很花時間的 :D。
在建立thread之前,我們先顯示一個progress dialog,完成工作後我們便會把它收起來。
dialog = ProgressDialog.show(ThreadHandlerDemoActivity.this, "Loading", "Please wait...");
怎麼把以上progress dialog收起呢?答案就是使用handler。新建一個handler,并馬上override handleMessage()如下:
h = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
dialog.dismiss(); //close the dialog
}
};
當以上handler收到message時,便會把dialog關閉。我們將在新的thread完成工作後通知handler h,以觸發以上handleMessage()。
我們要在新thread中override run(),并在當中加入這thread的工作。以下是我們建立這thread的coding:
//create a new thread
new Thread() {
@Override
public void run() {
super.run();
try {
//Time consuming task
Thread.sleep(10000);
h.sendEmptyMessage(0); //inform the handler
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
這thread主要工作就是sleep,我們完成sleep後,便會通知handler h。
Download: ThreadHandlerDemo