1. 程式人生 > >Android-在Handler更新UI報ViewRootImpl$CalledFromWrongThreadException錯誤

Android-在Handler更新UI報ViewRootImpl$CalledFromWrongThreadException錯誤

今天在寫程式的時候,new Thread()開啟一個子執行緒,在子執行緒裡面通過了Handler的dispatchMessage傳送訊息,在主執行緒中更新了UI後發現報出ViewRootImpl$CalledFromWrongThreadException異常

檢查程式碼流程步驟幾乎沒什麼問題,之後就檢測程式碼,發現,我發訊息用的是dispatchMessage方法,就試著換個方法,用了sendMessage,結果果然是這麼回事,後來上網查這兩者的區別,說的人不多,大致好像是因為dispatchMessage是新開了一個執行緒,而sendMessage是直接傳送訊息到主執行緒,所以更新UI的時候出現了問題。這也應證了,android裡面只能在主執行緒更新UI,和Toast。


    /**
     * 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來達到執行緒的轉換。
        }
    }
所以以後用handler時記得最好還是用sendMessage 或者post系列函式,因為post函式最終也會走到 sendMessageAtTime()