學習Android的線程互動,要掌握Thread, Looper, MessageQueue和Handler這四個概念。
1. Thread代表線程,不是每個Thread都有Looper,但Looper必須附在一個線程上。
2. Looper內部維護一個MessageQueue,即訊息佇列。
3. 每個MessageQueue中有一個Handler,Handler對象用來發送訊息到MessageQueue中,或接收Looper(從MessageQueue中)送來的訊息。
擷取Looper對象的引用:
Looper looper = Looper.myLooper();
為了與Looper進行溝通,我們需要構建一個Handler的子類,這裡我們將其命名為EventHandler。
EventHandler負責MessageQueue的存取工作。
籍由EventHandler,我們可以發送訊息給Looper,然後放入其MessageQueue中。
class EventHandler extends Handler { public EventHandler(Looper looper) { super(looper); } @override public void handleMessage(Message msg) { // 處理收到的Message textView.setText((String) msg.obj); }}
發送一個message:
EventHandler handler = new EventHandler(looper);handler.removeMessages(); // 清除MessageQueue中的事件String str = "Hello, message.";Message msg = handler.obtainMessage(1, 1, 1, str); // 組裝一個事件handler.sendMessage(msg); // 發送事件
在別的線程裡,若要向主線程發送Message,可用如下方法擷取主線程的Looper對象引用:
Looper mainLooper = Looper.getMainLooper();// 接下來擷取Handler,發送Message的代碼和之前一樣