android_消息模型

消息模型

消息原型,消息隊列,發送消息,消息循環,消息獲取,消息派發,消息處理,

Android把消息模型抽象成

Message:就是消息原型,包含消息描述和數據,

MessageQueue:就是消息隊列,由Looper所持有,但是消息的添加是通過Handler進行;

Looper:完成消息循環,實現Thread的消息循環和消息派發,缺省情況下Thread是沒有這個消息循環的既沒有Looper;需要主動去創建,然後啓動Looper的消息循環loop;與外部的交互通過Handler進行

Handler:就是駕馭整個消息系統模型,統領Message,MessgeQueue和Looper;

    消息循環和消息隊列都是屬於Thread,而Handler本身並不具有Looper和MessageQueue;

    但是消息系統的建立和交互,是Thread將Looper和MessageQueue交給某個Handler維護建立消息系統模型。所以消息系統模型的核心就是Looper。消息循環和消息隊列都是由Looper建立的,而建立Handler的關鍵就是這個Looper。一個Thread同時可以對應多個Handler,一個Handler同時只能屬於一個Thread。Handler屬於哪個Thread取決於Handler在那個Thread中建立。在一個Thread中Looper也是唯一的,一個Thread對應一個Looper,建立Handler的Looper來自哪個Thread,Handler屬於哪個Thread。故建立Thread消息系統,就是將Thread的Looper交給Handler去打理,實現消息系統模型,完成消息的異步處理

    Handler並不等於Thread,必須通過Thread的Looper及其MessageQueue,用來實現Thread消息系統模型,依附於Thread上

Handler作用

Handler主要接受子線程發送的數據,並用此數據配合主線程更新UI

1.子線程(耗時操作)借用主線程裏面的Handler發送一條消息到主線程

2.這個消息會被主線程放到消息隊列裏面的message queue

3.主線程裏面有一個輪詢器Looper會發現消息隊列裏面的消息調用Handler消息處理HandMessage方法

4.handleMessage方法中處理數據(更新UI

handler可以分發Message對象和Runnable對象到主線程中每個Handler實例,都會綁定到創建他的線程中(一般是位於主線程),

兩個作用:

       (1):  安排消息或Runnable 在某個主線程中某個地方執行,

       (2)安排一個動作在不同的線程中執行

        Handler中分發消息的一些方法

        post(Runnable)

        postAtTime(Runnable,long)

        postDelayed(Runnable long)

        sendEmptyMessage(int)

        sendMessage(Message)

        sendMessageAtTime(Message,long)

        sendMessageDelayed(Message,long)

        以上post類方法允許你排列一個Runnable對象到主線程隊列中,

        sendMessage類方法允許你安排一個帶數據的Message對象到隊列中,等待更新.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class MyHandler extends Activity {  
    static final String TAG = "Handler";  
    Handler h = new Handler(){  
        public void handleMessage (Message msg)  
        {  
            switch(msg.what)  
            {  
            case HANDLER_TEST:  
                Log.d(TAG, "The handler thread id = " + Thread.currentThread().getId() + "\n");  
                break;  
            }  
        }  
    };  
   
    static final int HANDLER_TEST = 1;  
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        Log.d(TAG, "The main thread id = " + Thread.currentThread().getId() + "\n");  
   
        new myThread().start();  
        setContentView(R.layout.main);  
    }  
   
    class myThread extends Thread  
    {  
        public void run()  
        {  
            Message msg = new Message();  
            msg.what = HANDLER_TEST;  
            h.sendMessage(msg);  
            Log.d(TAG, "The worker thread id = " + Thread.currentThread().getId() + "\n");  
        }  
    }  
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章