Handler主要是用於異步消息的處理,當發出一個消息之後,首先進入消息隊列(先進先出)也就是Message Queue,然後輪詢器Looper將消息隊列中的消息取出,最後對消息做出處理。這種機制通常被用來處理耗時比較長的操作。
- 消息隊列:通過Handler發送的消息並是即刻執行的,因此需要一個隊列來維護
- 工作線程:需要一個線程不斷摘取消息,並執行回調,這種線程就是Looper線程
- 互斥機制,會有不同的線程向同一個消息隊列插入消息,這個時候就需要同步機制進行保證
- 空消息隊列時候的同步機制,生產者消費者模型
注:android系統中不允許在子線程中不能更新UI,而只能必須在主線程(即UI線程)中進行更新;
每一條消息都需要被指定handler處理,而handler在這個時候就會創建消息,在創建消息之前會先查詢Message Queue中是否存在消息,如果有就可以直接從消息池中取出,如果沒有則重新初始化一個消息的實例。
主線程在初始化第一個handler的時候會通過ThreadLocal創建一個Looper,而這個looper則是和主線程一一對應的。而之後初始化的handler則會直接獲取第一個handler創建的looper。而在looper初始化的時候會創建一個Message Queue,這時候子線程向主線程發送消息時,handler會創建一個消息放入消息池。
上面提到了handler會創建一個消息放入消息池,之後looper就會去查詢消息隊列中是否存在消息,如果存在則取出,並根據消息的參數判斷所對應的handler,然後將消息傳給handler處理。