1,Lopper && MessageQueue
說明:每個activity進入Task棧頂時,會啟動一個線程,當前的線程會自動進行以下操作:
- Looper.prepare():創建一個looper,并設置為當前的線程所有,并且每個線程只能創建一個looper。在Looper的構造方法中,會創建一個消息隊列MessageQueue,用來保存由Handler發送過來的消息Message。
//創建looper:
public static final void prepare()
{
if (sThreadLocal.get() != null)
{
throw new RuntimeException("Onlyone Looper may be created per thread");
}
sThreadLocal.set(new Looper(true));
}
- Looper.loop():當前線程會進入一個無線循環體中不斷查詢消息隊列MessageQueue是否有新的消息Message,如果沒有消息,線程將陷入阻塞等待新消息;接收到新消息后,會對消息Message的target變量,即發送消息的Handler對象,發送接收到的消息。
//循環監聽消息隊列,處理接收到的消息:
public static void loop()
{
final Looper me = myLooper();
if (me == null)
{
throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
}
final MessageQueue queue = me.mQueue;
for (;;)
{
Message msg = queue.next(); // might block
if (msg == null)
{
// No message indicates that the message queue is quitting.
return;
}
msg.target.dispatchMessage(msg);
msg.recycle();
}
}
2,Handler
說明:使用Handler之前,要在當前Activity的主線程中,初始化一個Handler實例,在Handler的構造方法中,會獲取當前線程的Looper,進而獲取到當前線程的消息隊列MessageQueue,這樣Handler就和MessageQueue取得了關聯,進而可以進行消息發送和接收。具體使用如下:
- 在主線程中創建Handler對象,并重寫處理消息的方法:
//重寫handlerMessage:
private Handler mHandler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
switch (msg.what)
{
case value:
break;
default:
break;
}
};
};
- 在其它線程使用Handler對象,給當前消息隊列發送消息:
//發送消息:
mHandler.sendMessage(msg);