1. 程式人生 > >android主執行緒和子執行緒的區別

android主執行緒和子執行緒的區別


android 主執行緒和子執行緒有什麼區別

本文較為深入的分析了android中UI主執行緒與子執行緒。分享給大家供大家參考。

具體如下:在一個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的事件:

private final int UPDATE_UI = 1;

private Handler mHandler = new MainHandler();

private class MainHandler extends Handler {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case UPDATE_UI: {Log.i("TTSDeamon", "UPDATE_UI");

showTextView.setText(editText.getText().toString());

ShowAnimation();

break;

}

default:break;

}

       }

           }

或者:private Handler mHandler = new Handler(){

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case UPDATE_UI: {

Log.i("TTSDeamon", "UPDATE_UI");

showTextView.setText(editText.getText().toString());

ShowAnimation();

break;

}

default:break;

        }

             }

                   }

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

mHandler.sendEmptyMessageDelayed(UPDATE_UI, 0);

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