Android-在Handler更新UI報ViewRootImpl$CalledFromWrongThreadException錯誤
阿新 • • 發佈:2018-11-09
今天在寫程式的時候,new Thread()開啟一個子執行緒,在子執行緒裡面通過了Handler的dispatchMessage傳送訊息,在主執行緒中更新了UI後發現報出ViewRootImpl$CalledFromWrongThreadException異常
檢查程式碼流程步驟幾乎沒什麼問題,之後就檢測程式碼,發現,我發訊息用的是dispatchMessage方法,就試著換個方法,用了sendMessage,結果果然是這麼回事,後來上網查這兩者的區別,說的人不多,大致好像是因為dispatchMessage是新開了一個執行緒,而sendMessage是直接傳送訊息到主執行緒,所以更新UI的時候出現了問題。這也應證了,android裡面只能在主執行緒更新UI,和Toast。
所以以後用handler時記得最好還是用sendMessage 或者post系列函式,因為post函式最終也會走到 sendMessageAtTime()/** * Handle system messages here. */ public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg);////直接呼叫到了handler實現的handleMessage函式。 並沒有用MessageQuene來達到執行緒的轉換。 } }