星期日, 9月 11, 2011

AsyncTask(二)

Android應用程式學習筆記

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:
  1. Params-發送到task執行的參數的類別。
  2. Progress-在後台計算期間發布進度單位的類別。
  3. Results-後台計算的結果的類別。
並不是所有參數都會用到,用void標記沒有在用的參數。


private class MyTask extends AsyncTask<Void, Void, Void> { ... }

The 4 steps:
當異步task執行時,task會經過的4個步驟
  1. onPreExecute():task執行後,UI thread立即地調用onPreExecute,此步驟是task正常設置的步驟,例如,在使用者畫面上顯示進度列。
  2. doInBackground(Params...)-onPreExecute()執行結束background thread立即地調用doInBackground。這一步驟是用來執行後台計算,可以花很長的時間。異步task的參數傳遞到這一步驟,計算結果必須在這一步回傳並傳回到最後一步驟。在這一步驟也能使用publishProgess(Progress...)發布一個或多個進度列,onProgressUpdate(Progress...)在UI thread上發布這些值。
  3. onProgressUpdate(Progress...)-呼叫publishProgress(Progress...)之後,UI thread上調用onProgressUpdate(Progress...),未定義此方法執行的時序,這方法是用來顯示在使用者介面上的任何進度列,且當後台計算仍然在計算執行。例如,它能用來動畫進度列或者在文字控制鍵上顯示日誌。
  4. onPostExecute(Resluts)-後台計算結束後,UI thread調用onPostExecute(),此步驟後台計算結果被當作參數傳到此步。
Threading rules:

為了讓AsyncTask正確運作,以下有一些原則必須遵守:
  • 必須在UI thread中產生Task instance。
  • 必須在UI thread中調用execute(Params...)。
  • 禁止手動呼叫onPreExecute()、onPostExecute(Resluts)、doInBackground(Params)、onProgressUpdate(Progress..)方法。
  • 該task只能執行一次。

沒有留言:

張貼留言