1.Android的UI線程不安全,想要更新應用程序里的UI元素,則須在主線程中進行,否則會出現異常。
2.Android不允許在子線程里進行UI操作,對于該情況,Android提供了一套異步消息處理機制,完美解決在子線程中進行UI操作。
3.解析異步消息處理機制:
Android中的異步消息處理有四部分,Message, Handler, MessageQueue和Looper。
(1)Message:線程之間傳遞的消息,在內部攜帶少量的信息,用在不同線程間交換數據。
(2)Handler:處理者,用于發送和處理消息。發送消息使用Handler的sendMessage()方法,發出的消息經過一系列輾轉處理,
會傳遞到Handler的handleMessage()方法中。
(3)MessageQueue:消息隊列,用于存放所有通過Handler發送的消息。這部分消息會一直存在于消息隊列中,等待被處理。
每個線程中只有一個MessageQueue對象。
(4)Looper:每個線程中的MessageQueue的管家,調用Looper的loop()方法后,會進入到無限循環中,然后每當發現MessageQueue
中存在一條消息,會將它取出,傳遞到Handler的handleMessage()方法中。每個線程也只會有一個Looper對象。
4.異步消息處理的整個流程:Firstly,在主線程中創建一個Handler對象,并重寫handleMessage() 方法;Secondly,當子線程中需
要進行UI操作時,就創建個Message對象,并通過Handler將這條消息發送出去;Thirdly,消息被添加到MessageQueue隊列中等待被
處理,而Looper則會一直嘗試從MessageQueue中取出待處理消息,最后分發回Handler的handleMessage() 方法中。Handler在主線程中創建,此時handleMessage()方法中的代碼也會在主線程中運行,于是安心進行UI操作。
5.整個異步消息處理機制的流程示意圖如下:
一條Message經過這樣一個流程的輾轉調用后,也就從子線程進入到主線程,從不能更新UI變成可以更新UI。