Android消息机制学习笔记
Android的消息機制主要是指Handler的運行機制,Handler的運行需要底層的MessageQueue和Looper的支撐;
MessageQueue:消息隊列,它的內存存儲了一組消息,以隊列的形式對外提供插入和刪除的工作,內部結構:采用
單鏈表的數據結構來存儲消息隊列;
Looper:處理MessageQueue的消息,會以無限循環的形式去查找是否有新消息,有就處理無則等待,還要用到一個特殊的概念-ThreadLocal:并不是線程,作用:可以在每個線程中存儲數據,
ThreadLocal可以在不同的線程中互不干擾地存儲并提供數據,通過ThreadLocal可以輕松獲取每個線程的Looper。線程默認是沒有Looper的,如果需要使用Handler就必須為線程創建Looper;
UI線程即ActivityThread,ActivityThread被創建是就會初始化Looper,這也是在主線程中默認可以使用Handler的原因。
?
Handler創建完畢后,Looper和MessageQueue、Handler就可以一起協同工作了,1.通過Handler的post方法將一個Runnable投遞到Handler內部的Looper中取處理
2.通過Handler的send方法發送一個消息,這個消息同樣會在Looper中去處理;其中post方法最終也是通過send方法來完成;
send的過程:當Handler的send方法被調用時,它會調用MessageQueue的enqueueMessage方法將這個消息放入消息隊列中,然后Looper發現有新的到來時,就會處理這個消息,
最終消息中的Runnable或者Handler的handleMessage方法就會被調用。注意Looper是運行在創建Handler所在的線程中的,這樣一來Handler中的業務邏輯就被切換到創建Handler所在的
線程中去執行了。
?Message的callback是一個Runnable對象,實際上就是Handler的post方法所傳遞的Runnable參數
Handler的工作原理
Handler工作主要包含消息的發送和接收過程,通過post的一系列方法以及send的一系列方法來實現,而post方法最總是通過send的一系列方法來實現的。
Handler最總會交給dispatchMessage方法調用,而檢查的Message的Callback實際上是Handler的post方法所傳遞的Runnable參數
Callback可以代替創建Hander的實例而去使用handler
Handler是必須通過Looper來構造Handler.
public void dispatchMessage(Message msg){if(msg.callback != null){ //當message是runnable的情況,也就是Handler的post方法傳遞的參數,這種情況下直接執行runnable的run方法 handleCallback(msg); } else { if(mCallback != null){{//如果創建Handler的時候是給Handler設置了Callback接口的實現,那么此時調用該實現的handleMessage方法 if(mCallback.handleMessage(msg)){ return; } } handleMessage(msg);//如果是派生Handler的子類,就要重寫handleMessage方法,那么此時就是調用子類實現的handleMessage方法 } } public Handler(Looper looper){this(looper, null, false); }
轉載于:https://www.cnblogs.com/banzhuan/p/6853391.html
總結
以上是生活随笔為你收集整理的Android消息机制学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带宝宝做艾灸大概需要做几次?
- 下一篇: 方法重载演示