Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 解析Android中的main線程與子線程

解析Android中的main線程與子線程

編輯:Android開發實例

       在一個Android 程序開始運行的時候,會單獨啟動一個Process。默認的情況下,所有這個程序中的Activity或者Service(Service和Activity只是Android提供的Components中的兩種,除此之外還有Content Provider和Broadcast Receiver)都會跑在這個Process。

        一個Android 程序默認情況下也只有一個Process,但一個Process下卻可以有許多個Thread。
  
       在這麼多Thread當中,有一個Thread,我們稱之為UI Thread。UI Thread在Android程序運行的時候就被創建,是一個Process當中的主線程Main Thread,主要是負責控制UI界面的顯示、更新和控件交互。在Android程序創建之初,一個Process呈現的是單線程模型,所有的任務都在一個線程中運行。因此,我們認為,UI Thread所執行的每一個函數,所花費的時間都應該是越短越好。而其他比較費時的工作(訪問網絡,下載數據,查詢數據庫等),都應該交由子線程去執行,以免阻塞主線程。


        那麼,UI Thread如何和其他Thread一起工作呢?常用方法是:

        誕生一個主線程的Handler物件,當做Listener去讓子線程能將訊息Push到主線程的Message Quene裡,以便觸發主線程的handlerMessage()函數,讓主線程知道子線程的狀態,並在主線程更新UI。


       例如,在子線程的狀態發生變化時,我們需要更新UI。如果在子線程中直接更新UI,通常會拋出下面的異常:
  
        11-07 13:33:04.393: ERROR/JavaBinder(1029):android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.

       意思是,無法在子線程中更新UI。為此,我們需要通過Handler物件,通知主線程Ui Thread來更新界面。

        如下,首先創建一個Handler,來監聽Message的事件:

 

  1. private final int UPDATE_UI = 1;  
  2.  private Handler mHandler = new MainHandler();  
  3.  
  4. private class MainHandler extends Handler {  
  5.    @Override 
  6.        public void handleMessage(Message msg) {  
  7.        switch (msg.what) {  
  8.            case UPDATE_UI: {  
  9.           Log.i("TTSDeamon", "UPDATE_UI");  
  10.           showTextView.setText(editText.getText().toString());  
  11.           ShowAnimation();  
  12.                break;  
  13.            }  
  14.            default:  
  15.                break;  
  16.        }  
  17.    }  
  18.  }  
  19.  
  20. 者  
  21.  
  22. private Handler mHandler = new Handler(){  
  23.    @Override 
  24.        public void handleMessage(Message msg) {  
  25.        switch (msg.what) {  
  26.            case UPDATE_UI: {  
  27.           Log.i("TTSDeamon", "UPDATE_UI");  
  28.           showTextView.setText(editText.getText().toString());  
  29.           ShowAnimation();  
  30.                break;  
  31.            }  
  32.            default:  
  33.                break;  
  34.        }  
  35.     }  
  36. }  


       當子線程的狀態發生變化,則在子線程中發出Message,通知更新UI。

       mHandler.sendEmptyMessageDelayed(UPDATE_UI, 0);

   
      在我們的程序中,很多Callback方法有時候並不是運行在主線程當中的,所以如果在Callback方法中更新UI失敗,也可以采用上面的方法。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved