Android的Handler消息機制

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);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容