AsyncTask
Asynctask能夠正確且點易的使用UI thread,此類別允許了執行後台操作和發布結果在UI thread上,而無須操作thread或handler。
異步task由三個通用型別(Params、Progress、Results)與四步驟(onPreExecute、doInBackground、onProgressUpdate、onPostExecute)組成。
例子
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } }
建立好後,執行task。
new DownloadFilesTask().execute(url1, url2, url3);
AsyncTask's generic type:
- Params-發送到task執行的參數的類別。
- Progress-在後台計算期間發布進度單位的類別。
- Results-後台計算的結果的類別。
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
The 4 steps:
當異步task執行時,task會經過的4個步驟
- onPreExecute():task執行後,UI thread立即地調用onPreExecute,此步驟是task正常設置的步驟,例如,在使用者畫面上顯示進度列。
- doInBackground(Params...)-onPreExecute()執行結束background thread立即地調用doInBackground。這一步驟是用來執行後台計算,可以花很長的時間。異步task的參數傳遞到這一步驟,計算結果必須在這一步回傳並傳回到最後一步驟。在這一步驟也能使用publishProgess(Progress...)發布一個或多個進度列,onProgressUpdate(Progress...)在UI thread上發布這些值。
- onProgressUpdate(Progress...)-呼叫publishProgress(Progress...)之後,UI thread上調用onProgressUpdate(Progress...),未定義此方法執行的時序,這方法是用來顯示在使用者介面上的任何進度列,且當後台計算仍然在計算執行。例如,它能用來動畫進度列或者在文字控制鍵上顯示日誌。
- onPostExecute(Resluts)-後台計算結束後,UI thread調用onPostExecute(),此步驟後台計算結果被當作參數傳到此步。
為了讓AsyncTask正確運作,以下有一些原則必須遵守:
- 必須在UI thread中產生Task instance。
- 必須在UI thread中調用execute(Params...)。
- 禁止手動呼叫onPreExecute()、onPostExecute(Resluts)、doInBackground(Params)、onProgressUpdate(Progress..)方法。
- 該task只能執行一次。
沒有留言:
張貼留言