先看整體模型
在new Handler的時候會在構(gòu)造函數(shù)里面同時實例化一個Looper
所以實例化Handler的前提條件就是要先實例化一個Looper,調(diào)用Looper.prepare()來實現(xiàn)的,沒有調(diào)用prepare,是無法實例化Handler的,這里要注意ThreadLocal是在prepare函數(shù)那邊set了Looper對象相速,所以get的時候才會有值,關(guān)于ThreadLocal可以專門看別的文章,是線程私有變量的容器敷扫,有點小復(fù)雜
這個Looper實例化的時候會同時實例化一個MessageQueue,和獲取當前線程
綜上所述诚卸,如果要在一個子線程實例化Handler的時候必須先調(diào)用Looper.prepare()葵第,而主線程在創(chuàng)建activity的時候就已經(jīng)調(diào)用了prepare(),所以我們可以在主線程直接實例化Handler合溺;
Android提供了一個封裝好的帶有l(wèi)ooper的線程類卒密,即為HandlerThread,其實現(xiàn)在用了rxjava后棠赛,Handler這塊就不用擔心內(nèi)存泄漏哮奇,如果想自己開啟一個隊里來管理,可以考慮HandlerThread睛约,但是內(nèi)存開銷要注意鼎俘;