一、解決新線程無法更新UI組建問題的方案
為了解決新線程不能更新UI組建的問題,Andorid提供了如下幾種解決方案:
-
使用Handler實現線程之間的通信。
-
Activity.runOnUiThread(Runnable)。
-
View.post(Runnable)。
-
View.postDelayed(Runnable)。
二、ANR(Application Not Responding)異常
Android默認約定當UI線程阻塞超過20秒將會引發ANR(Application Not Responding)異常。但實際上,不要說20秒,即使是5秒甚至2秒,用戶都會感到十分不爽。因此,沒必要去記這個20秒的時間限度。總之,開發者必須牢記:不要在UI線程中執行一些耗時操作。
三、AsyncTask抽象類
AsyncTask<Params,Progress,Result>是一個抽象類,通常用於被繼承,繼承AsyncTask需要指定如下三個泛型參數:
-
Params:啟動任務執行的輸入參數的類型。
-
Progress:后台任務完成進度值的類型。
-
Result:后台執行任務完成后返回結果的類型。
四、AsyncTask的特點
-
更輕量級一些,適用於簡單的異步處理,不需要借助線程和Handler即可。
五、使用AsyncTask的步驟
1.創建AsyncTask的子類,並為三個泛型參數指定類型。如果某個泛型參數不需要指定類型,可將它指定為void。
2.根據需要,實現AsyncTask的如下方法:
doInBackground(Params …):后台線程將要完成的任務,可以調用publishProgress(Progress... values)方法更新任務執行進度。
onProgressUpdate(Progress... values):在doInBackground()方法中調用publishProgress()方法更新任務的執行進度后,就會觸發該方法。
onPreExecute():執行后台耗時操作前被調用,通常用戶完成一些初始化操作,比如在界面上顯示進度條。
onPostExecute(Result result):當doInBackground()完成后,系統會自動調用onPostExecute()方法,並將doInBackground方法返回的值傳給該方法。
3.調用AsyncTask子類的實例的execute(Params... params)開始執行耗時任務。
六、使用AsyncTask時必須遵守的規則
-
必須在UI線程中創建AsyncTask的實例。
-
必須在UI線程中調用AsyncTask的execute()方法。
-
AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params... params)、onProgressUpdate(Progress... values)方法,不應該由程序員代碼調用,而是由Android系統負責調用。
-
每個AsyncTask只能被執行一次,多次調用將會引發異常。
