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]; } }