Handler主要接受子線程發送的資料, 並用此資料配合主線程更新UI..
當應用程式啟動時,Android首先會開啟一個主線程 (也就是UI線程) , 主線程為管理介面中的UI控制項,進行事件分發。比如說, 你要是點擊一個 Button ,Android會分發事件到Button上,來響應你的操作。 如果此時需要一個耗時的操作,例如: 連網讀取資料或者讀取本地較大的一個檔案的時候,你不能把這些操作放在主線程中,,如果你放在主線程中的話,介面會出現假死現象, 如果5秒鐘還沒有完成的話,,會收到Android系統的一個錯誤提示 "強制關閉". 這個時候我們需要把這些耗時的操作,放在一個子線程中,因為子線程涉及到UI更新,,Android主線程是線程不安全的,也就是說,更新UI只能在主線程中更新,子線程中操作是危險的. 這個時候,Handler就出現了.,來解決這個複雜的問題 , 由於Handler運行在主線程中(UI線程中), 它與子線程可以通過Message對象來傳遞資料, 這個時候,Handler就承擔著接受子線程傳過來的(子線程用sedMessage()方法傳弟)Message對象,(裡麵包含資料) , 把這些訊息放入主線程隊列中,配合主線程進行更新UI。
我們先來看一下handler的簡單使用方法
package com.example.android_handler_textview;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity {private Button button;private static TextView textView;private MyHandler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button = (Button) this.findViewById(R.id.button1);textView = (TextView) this.findViewById(R.id.msg);handler = new MyHandler();button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubnew Thread(new MyThread()).start();}});}public static class MyHandler extends Handler {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);int arg1 = msg.arg1;String name = (String) msg.obj;textView.append(name + arg1);}}public class MyThread implements Runnable {int count = 0;@Overridepublic void run() {// TODO Auto-generated method stubwhile (count <= 20) {try {Thread.sleep(500);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}// 從訊息池中擷取訊息,如果沒有訊息,建立一個訊息,如果有,則取出來訊息攜帶資料,由handler發送Message message = Message.obtain();message.arg1 = count;message.obj = "jack";count++;handler.sendMessage(message);}}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}