1.Handler簡介
Android中規定只允許在UI主線程當中來操作UI,在子線程中不允許更新UI,而當我們需要在子線程中進行一些耗時操作完成后需要更新界面UI,此時我們該怎么辦,這個時候我們就可以用到Handler,所以可以說Handler的作用是為了通知主線程更新ui,但這只是Handler的一個作用,只是我們開發時常常用Handler來更新UI而已。在這里很多人會疑問為什么規定要只能在主線程更新UI,因為多個子線程來同時操作UI的話,則容易造成很多不可知的現象,即線程是不安全的,很多人也會疑問為啥不用鎖機制呢,鎖機制的話有兩個缺點:a、鎖機制讓UI更新邏輯變得更復雜 b、鎖機制會阻礙一些線程,使更新效率大大降低。
2.Handler消息機制中關聯到的一些類:Looper,MessageQueue,ThreadLocal,Message等
3.Handler源碼分析
首先看構造函數
上面的源碼清晰的說明:首先會獲取當前線程的Looper對象,為null則直接報錯,因此在子線程中我們必須自己調用Looper.PRepare()來創建Looper對象,其次獲取到Looper對象后則獲取looper當中的MessageQueue對象,這兩個對象獲取到后對消費的分發處理則有了保障。這兩個類后面會詳細描述。
接著看我們常用的handmessage方法和sendMessage方法,我們主要說這兩個方法。
這個handmessage方法我們要實現的,其實實際上是dispatchMessage方法中處理消息,這個很簡單,大家應該都看得懂。接下來sendMessage方法:
這個方法也很簡單,相信大家都看得懂,簡單就是調用MessageQueue的enqueueMessage方法把消息存進MessageQueue中。也就是Handler其實是一個領導者,它通過協調Looper和MessageQueue等進行協同作業。
4.Looper源碼分析
Looper輪詢器的意思,就是無限輪詢MessageQueue中的消息,有就發出來讓handler處理,沒有就等待中。
同樣看prepare()方法和loop()兩個關鍵方法:
新聞熱點
疑難解答