消息機制

每個android應用在被啓動時都會創建一個線程,這個線程成爲主線程或者UI線程。android應用的所有操作默認都會運行在這個線程中。但是爲了保證UI的流暢性,通常都會將耗時的操作放在子線程中。android3.0後,禁止在主線程中執行網絡請求,否則會拋出異常,可見UI線程中執行耗時操作是非常不推薦的行爲。
我們知道android應用啓動時,會默認有一個主線程,在這個線程中會關聯一個消息隊列,所有的操作都被封裝成消息然後交給主線程來處理。爲了保證主線程不會主動退出,會將獲取消息的操作放在一個死循環中,這樣程序就相當於一直在執行死循環。
每個Handler都會關聯一個消息隊列,消息隊列被封裝在looper中,每個looper又會關聯一個線程,looper通過ThreadLocal封裝,最終就等於每個消息隊列會關聯一個線程。Handler就是消息處理器,將消息投遞給消息隊列,然後再由對應的線程從消息隊列中取出消息執行。默認情況下,消息隊列只有一個,即主線程的消息隊列,這個消息隊列是在ActivityThread.main方法中創建的,通過Looper.prepareMainLooper來創建,最後執行Looper.loop來啓動消息循環。
消息隊列通過Looper與線程關聯上,而Handler又於looper關聯,因此Handler最終就和線程的消息隊列關聯上。就是因爲Handler要與主線程的消息隊列關聯上,這樣handleMessage纔會執行在UI線程,此時更新UI纔是線程安全的。
通過Looper.prepare來創建Looper對象,消息隊列封裝在looper對象中,並且保存在sThreadLocal中,然後通過Looper.loop來執行消息循環,這兩步通常是成對出現的。
子線程中創建Handler爲何拋出異常呢,因爲在子線程中創建Handler對象時,如果Looper對象爲空,那麼就會拋出Cannot create handler inside thread that has not called looper.prepare異常。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章