Handler

 Handler是Android消息模型最重要的一個組件,使用它可以在線程之間相互發送消息,實現線程之間的通信。處理使用Handler發送消息以外,通常需要繼承Handler類,並重寫handleMessage(Message msg) 方法, 接收消息並處理消息。

下面通過一個實例來說明Handler的使用方法。例子的主要功能是:通過線程修改界面Button的內容,完整的代碼如下:


注意:用Handler的obtainMessage方法獲得的Message可以省去創建Message的空間開銷


01 public class MyHandlerActivity extends Activity {
02  
03     Button button;
04     MyHandler myHandler;
05  
06     protected void onCreate(Bundle savedInstanceState) {
07         super.onCreate(savedInstanceState);
08         setContentView(R.layout.handlertest);
09         button = (Button) findViewById(R.id.button);
10         myHandler = new MyHandler();
11         // 當創建一個新的Handler實例時, 它會綁定到當前線程和消息的隊列中,開始分發數據
12         // Handler有兩個作用,
13            //(1) : 定時執行Message和Runnalbe 對象
14         // (2): 讓一個動作,在不同的線程中執行.
15         // 它安排消息,用以下方法
16         // post(Runnable)
17         // postAtTime(Runnable,long)
18         // postDelayed(Runnable,long)
19         // sendEmptyMessage(int)
20         // sendMessage(Message);
21         // sendMessageAtTime(Message,long)
22         // sendMessageDelayed(Message,long)
23         // 以上方法以 post開頭的可以處理Runnable對象
24         //sendMessage()可以處理Message對象(Message裏可以包含數據,)
25         MyThread m = new MyThread();
26         new Thread(m).start();
27     }
28  
29     /**
30     * 接受消息,處理消息 ,此Handler會與當前主線程一塊運行
31     * */
32     class MyHandler extends Handler {
33         
34            //默認構造函數
35            public MyHandler() {
36                   super();
37         }
38          
39            // 帶有Looper參數的構造函數
40            public MyHandler(Looper L) {
41             super(L);
42         }
43         // 子類必須重寫此方法,處理消息
44         @Override
45         public void handleMessage(Message msg) {
46             Log.d("MyHandler""handleMessage......");
47             super.handleMessage(msg);
48             // 此處可以更新UI
49             Bundle b = msg.getData();
50             String color = b.getString("color");
51                    String btn = msg.obj.toString();
52             MyHandlerActivity.this.button.append(color + btn);
53         }
54     }
55  
56     class MyThread implements Runnable {
57         public void run() {
58             try {
59                 Thread.sleep(2000);
60             catch (InterruptedException e) {
61                 // TODO Auto-generated catch block
62                 e.printStackTrace();
63             }
64             Log.d("thread.......""mThread........");
65                    // 使用Message能夠傳遞多種數據具體可以參考Message的源碼
66                    // 最常用的可以使用Message的obj對象在線程之間傳遞對象數據
67             Message msg  =  new Message();
68             Bundle b = new Bundle();// 存放數據
69             b.putString("color""Red");
70             msg.setData(b);
71                    msg.obj = new String(“Button”);
72             MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler發送消息,更新UI
73         }
74     }
75 }


發佈了54 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章