朋友跳槽,面試時被問到子執行緒可以建立handler嗎?對於這個問題,其實我也是有點疑惑,暫且不論子執行緒建立handler的應用場景,對於能不能建立這個事情我還是比較好奇的,作為一名愛較真的程式猿,馬上開啟androidstudio寫個demo測試。
new thread()
}.start();
經過驗證直接採用new的方式在子執行緒中建立handler會出現錯誤:」can』t create handler inside thread that has not called looper.prepare()。按照提示,應該在new handler()之前,呼叫looper.prepare();但是為什麼要呼叫這個方法呢?這個方法又是什麼作用呢?看下原始碼:
public
static
void
prepare()
private
static
void
prepare(boolean quitallowed)
sthreadlocal.set(new looper(quitallowed));
}
原來prepare方法為當前的handler建立了乙個新的looper,但是經過嘗試,子執行緒中handler發的訊息不能被取到,這是為什麼呢?為什麼activity中建立的handler就可以被取到?通過檢視原始碼,發現,在主線程中建立的handler,也擁有looper,而且呼叫了looper.loop(),開啟訊息訊息處理。於是,我們採用如下方法在子執行緒中建立handler
new thread()
}.start();
大功告成。
經過一番思考,恍然大悟,原來子執行緒建立handler有著這樣的應用場景:子執行緒中去建立乙個handler,使用這個handler例項在任何其他執行緒中傳送訊息,最終處理訊息的**都會在建立handler例項的執行緒中執行。
朋友們,喜歡就支援下,如有錯誤,敬請指正!
子執行緒中建立handler
方法1 android顯示操作介面,需要在主線程中執行 不在主線程中需要在handler中執行 looper.prepare myhandler new handler new handler.callback looper.loop 必須開始looper但是開啟的時刻可以自己控制 方法2 publ...
子執行緒中使用Handler
在子執行緒中使用handlerlooper.prepare mhandler new handler mhandler.sendemptymessage 1 looper.loop 在子執行緒中更新uihandler main new handler getmainlooper 今天寫這篇文章主要是...
Handler 主線程如何通知子執行緒
在 android 中,不可以在子執行緒中更新 ui 的操作,否則會報錯或者異常資訊。在這種情況下,我們會使用 handler 在 ui 執行緒建立該物件 接收子執行緒的訊息更新 ui.可見,此時的 handlemessage 是在主線程中執行的。每個主線程預設有乙個 looper,也就是說在主線程...