1,Lopper && MessageQueue
說(shuō)明:每個(gè)activity進(jìn)入Task棧頂時(shí),會(huì)啟動(dòng)一個(gè)線程,當(dāng)前的線程會(huì)自動(dòng)進(jìn)行以下操作:
- Looper.prepare():創(chuàng)建一個(gè)looper,并設(shè)置為當(dāng)前的線程所有,并且每個(gè)線程只能創(chuàng)建一個(gè)looper。在Looper的構(gòu)造方法中,會(huì)創(chuàng)建一個(gè)消息隊(duì)列MessageQueue,用來(lái)保存由Handler發(fā)送過(guò)來(lái)的消息Message。
//創(chuàng)建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():當(dāng)前線程會(huì)進(jìn)入一個(gè)無(wú)線循環(huán)體中不斷查詢消息隊(duì)列MessageQueue是否有新的消息Message,如果沒(méi)有消息,線程將陷入阻塞等待新消息;接收到新消息后,會(huì)對(duì)消息Message的target變量,即發(fā)送消息的Handler對(duì)象,發(fā)送接收到的消息。
//循環(huán)監(jiān)聽(tīng)消息隊(duì)列,處理接收到的消息:
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
說(shuō)明:使用Handler之前,要在當(dāng)前Activity的主線程中,初始化一個(gè)Handler實(shí)例,在Handler的構(gòu)造方法中,會(huì)獲取當(dāng)前線程的Looper,進(jìn)而獲取到當(dāng)前線程的消息隊(duì)列MessageQueue,這樣Handler就和MessageQueue取得了關(guān)聯(lián),進(jìn)而可以進(jìn)行消息發(fā)送和接收。具體使用如下:
- 在主線程中創(chuàng)建Handler對(duì)象,并重寫(xiě)處理消息的方法:
//重寫(xiě)handlerMessage:
private Handler mHandler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
switch (msg.what)
{
case value:
break;
default:
break;
}
};
};
- 在其它線程使用Handler對(duì)象,給當(dāng)前消息隊(duì)列發(fā)送消息:
//發(fā)送消息:
mHandler.sendMessage(msg);