Android應用中的消息循環由Looper和Handler配合完成,Looper類用於封裝消息循環,類中有個MessageQueue消息隊列;Handler類封裝了消息投遞和消息處理等功能。
系統默認情況下只有主線程(即UI線程)綁定Looper對象,因此在主線程中可以直接創建Handler的實例,但是在子線程中就不能直接new出Handler的實例了,因為子線程默認並沒有Looper對象,此時會拋出RuntimeException異常:
浏覽下Handler的默認構造函數就一目了然了:
如果需要在子線程中使用Handler類,首先需要創建Looper類實例,這時可以通過Looper.prepare()和Looper.loop()函數來實現的。閱讀Framework層源碼發現,Android為我們提供了一個HandlerThread類,該類繼承Thread類,並使用上面兩個函數創建Looper對象,而且使用wait/notifyAll解決了多線程中子線程1獲取子線程2的Looper對象為空的問題。HandlerThread類完整代碼如下: