Home 主頁 Service 服務計畫 Android App 手機程式 Expertise 專業領域 Blog 博客 Download 下載 FAQ 網頁製作常見問題 Support 支援 Links 友情連結 Contact Us 聯絡我們

16 - Thread與Handler

發佈: 08-18-2011

分類: Android 開發教學

第十三課: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

訪客: Copyright ©2011 KF Software House 版權所有 | 網站地圖