子線程中處理UI,拋異常 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original

activity中 處理子線程(工作線程)有兩原則:

    1. Do not block the UI thread (不要阻塞UI線程)

    2. Do not access the Android UI toolkit from outside the UI thread (不要在工作線程中操作UI元素)

原因:

    *  當在UI線程中進行某些耗時的操作時,將會阻塞UI線程,一般阻塞超過5秒就會顯示一個ANR對話框

    *  UI線程是非線程安全的,所以,不能在工作線程中操作UI元素。

例如以下代碼

new Thread(new Runnable() { 
    @Override  
            public void run()  
            {  
                //處理耗時操作,  例如請求後臺數據
                //處理ui元素,  例如給ui控件設置...... 
            }
}

以上操作都會拋如標題所示的異常:

解決此問題,可以使用android官方提供的 AsyncTask<String, Void, String> 來解決

首先可以寫個內部類繼承該類,

然後重寫doInBackground方法和onPostExecute方法

doInBackground方法中處理一些耗時的操作, 如請求後臺數據...

onPostExecute方法中處理ui元素的一些操作,如把請求得到的後臺數據添加給相應的ui控件

以下是一個基本代碼

/** 異步獲取數據*/
	class MyTask extends AsyncTask<String, Void, String> {

		@Override
		protected void onPostExecute(String result) {
			// 對UI組件的更新操作
			// 接收的result參數,就是下面return過來的數據
			// 可以把數據處理了後,扔給ui控件
		}

		@Override
		protected String doInBackground(String... params) {
			// 耗時的操作
			// 如請求後臺數據, 可以把請求到的數據return出去
			return params[0];
		}
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章