Android android.view.ViewRoot$CalledFromWrongThreadException異常的解決方案

android.view.ViewRoot$CalledFromWrongThreadException異常的解決方案

在Android平臺下,進行多線程編程時,常常須要在主線程以外的一個單獨的線程中進行某些處理,而後更新用戶界面顯示。可是,在主線線程以外的線程中直接更新頁面顯示的問題是java

 

報異常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.android

【只有原始建立這個視圖層次(view hierachy)的線程才能修改它的視圖(view)】編程

也就是說必須在通常必須在程序的主線程(也就是ui)線程中進行更新界面顯示的工做。能夠採用下面的方法之一來解決:多線程

法1:ide

在Activity.onCreate(Bundle savedInstanceState)中建立一個Handler類的實例, 在這個Handler實例的handleMessage回調函數中調用更新界面顯示的函數。函數

/** 
     * 啓動線程用來刷新登陸提示文字,N秒刷新一次 
     *  
     */  
    private class FreshWordsThread extends Thread  
    {  
        @Override  
        public void run()  
        {  
            try  
            {  
                mLoadingWords = "test";  
                mLoadhandler.sendEmptyMessage(REFRESH);  
            }  
            catch (InterruptedException e)  
            {  
                e.printStackTrace();  
                Thread.currentThread().interrupt();  
            }  
        }  
    }  
  
  
  
    //主線程中的handler  
    class LoadHandler extends Handler  
    {  
        /** 
         * 接受子線程傳遞的消息機制 
         */  
        @Override  
        public void handleMessage(Message msg)  
        {  
            super.handleMessage(msg);  
            int what = msg.what;  
  
            Log.i(TAG, "Main handler message code: " + what);  
            switch (what)  
            {                  
                case REFRESH:  
                {  
                    // 刷新頁面的文字  
                    mLoadingText.setText(mLoadingWords);  
                    break;  
                }  
  
            }  
        }  
        
    }

法2:利用Activity.runOnUiThread(Runnable)把更新ui的代碼建立在Runnable中,而後在須要更新ui時,把這個Runnable對象傳給Activity.runOnUiThread(Runnable)。 這樣Runnable對像就能在ui程序中被調用。ui

FusionField.currentActivity.runOnUiThread(new Runnable() {  
	public void run() {  
		Toast.makeText(FusionField.currentActivity, "Success", Toast.LENGTH_LONG).show();  
	}  
});
相關文章
相關標籤/搜索