Android的Handler消息機(jī)制

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);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容