在Android中提供了一個異步任務的類AsyncTask,簡單來說,這個類中的任務是運行在后臺線程中的, 并可以將結果放到UI線程中進行處理,它定義了三種泛型,分別是Params、PRogress和Result,分別表示請求的參數、任務的進度和獲得結果的數據。 1. 使用原因: * 是其中使用了線程池技術,而且其中的方法很容易實現調用 * 可以調用相關的方法,在開啟子線程前和后,進行界面的更新 * 一旦任務多了,不用每次new新的線程,可以直接調用 2. 執行的順序: onPreExecute()[執行前開啟]—>doInBackground()—>onProgressUpDate()—>onPostExecute() 3. 執行過程: 當一個異步任務開啟后,執行過程如下: * onPreExecute(): 這個方法是執行在主線程中的,這步操作是用于準備好任務的,作為任務加載的準備工作。建議在這個方法中做好初始化工作,彈出一個對話框。 * doInBackground(): 這個方法是執行在子線程中的,當onPreExecute()執行完后,會立即開啟這個方法,在方法中可以執行耗時的操作,需要將請求參數傳遞進來,發給服務器,并將獲取到的數據返回,數據會傳給最后一步中:這些值都是將被放到主線程種,也可以不斷的傳給下一步的onProgressUpdate()中進行更新,可以通過不斷調用publishProgress(),將數據(或進度)不斷傳遞給onProgressUpdate()方法,進行不斷更新界面 * onProgressUpdate(): 這個方法是執行在主線程中的,publishProgress()在被調用后才開啟的這個方法,它在何時被開啟是不確定的,執行這個方法的過程中,doInBackground()是仍在執行的,即子線程還在運行著 * onPostExecute(): 這個方法是執行在主線程中的,當后臺的子線程執行完畢后才調用此方法。doInBackground()返回的結果會作為參數被傳遞過來,可以在這個方法中進行更新界面的操作 * execute(): 最后創建AsyncTask自定義的類,開啟異步任務 4. 實現原理: 1. 線程池的創建: 在創建了AsyncTask的時候,會默認創建一個線程池ThreadPoolExecutor,并默認創建出5個線程放入到線程池中,最多可放128個線程,且這個線程池是公共的唯一一份。 2. 任務的執行: 在exexute中,會執行run方法,當執行完run方法后,會調用scheduleNext()不斷的從雙端隊列中輪詢,獲取下一個任務并繼續放到一個子線程中執行,知道異步任務執行完畢 3. 消息的處理: 在執行完onPreExecute()方法之后,執行了doInBackground()方法,然后就不斷的發送請求獲取數據,在這個AsycTask中維護了一個InternalHandler的類,這個類是繼承Handler的,獲取的數據是通過handler進行處理和發送的。在其handlerMessage方法中,將消息傳遞給onProgressUpdate()進行進度的更新,也就可以將結果發送到主線程中,進行界面的更新了 5. 需要注意的是: * 這個AsyncTask類必須由子類調用 * 雖然是放在子線程中執行的操作,但是不建議做特別耗時的操作,如果操作過于耗時,建議使用線程池TreadPoolExecutor和FutureTask
新聞熱點
疑難解答