•  AsyncTask 

       AsyncTask是抽象類別,子類必須實現抽象方法doInBackground(Params... p) ,在此方法中實現任務的執行工作,比如連接網路獲取資料等。通常還應該實現onPostExecute(Result r)方法,因為應用程式關心的結果在此方法中返回。需要注意的是AsyncTask一定要在主執行緒中創建實例。AsyncTask定義了三種泛型類型 ParamsProgressResult

  • Params 啟動任務執行的輸入參數,比如HTTP請求的URL
  • Progress 幕後工作執行的百分比。
  • Result 後臺執行任務最終返回的結果,比如String

       AsyncTask的執行分為四個步驟,與前面定義的TaskListener類似。每一步都對應一個回檔方法,需要注意的是這些方法不應該由應用程式調用,開發者需要做的就是實現這些方法。在任務的執行過程中,這些方法被自動調用。

  • onPreExecute() 當任務執行之前開始調用此方法,可以在這裡顯示進度對話方塊。
  • doInBackground(Params...) 此方法在後臺執行緒執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以調用publicProgress(Progress...)來更新任務的進度。
  • onProgressUpdate(Progress...) 此方法在主執行緒執行,用於顯示任務執行的進度。
  • onPostExecute(Result) 此方法在主執行緒執行,任務執行的結果作為此方法的參數返回。

       PageTask擴展了AsyncTask,在doInBackground()方法中讀取網頁內容。PageTask的原始程式碼如下所示:

  1. // 設置三種類型參數分別為String,Integer,String  
  2.     class PageTask extends AsyncTask<String, Integer, String> {  
  3.   
  4.         // 可變長的輸入參數,與對應  
  5.         @Override  
  6.             try {  
  7.                 HttpClient client = new DefaultHttpClient();  
  8.                 // params[0]代表連接的url  
  9.                 HttpGet get = new HttpGet(params[0]);  
  10.                 String s = null;  
  11.                 if (is != null) {  
  12.                     ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  13.                     byte[] buf = new byte[128];  
  14.                     int ch = -1;  
  15.                     int count = 0;  
  16.                         count += ch;  
  17.                         if (length > 0) {  
  18.                             // 如果知道回應的長度,調用publishProgress()更新進度  
  19.                             publishProgress((int) ((count / (float) length) * 100));  
  20.                         }  
  21.                         // 為了在模擬器中清楚地看到進度,讓執行緒休眠100ms  
  22.                     }  
  23.                 // 返回結果  
  24.                 return s;  
  25.             } catch (Exception e) {  
  26.             }  
  27.             return null;  
  28.         }  
  29.         @Override  
  30.         protected void onCancelled() {  
  31.         }  
  32.         @Override  
  33.         protected void onPostExecute(String result) {  
  34.             // 返回HTML頁面的內容  
  35.         }  
  36.         @Override  
  37.         protected void onPreExecute() {  
  38.             // 任務啟動,可以在這裡顯示一個對話方塊,這裡簡單處理  
  39.         }  
  40.         @Override  
  41.             // 更新進度  
  42.         }  
  43.     }  

      執行PageTask非常簡單,只需要調用如下代碼。重新運行NetworkActivity,不但可以抓取網頁的內容,還可以即時更新讀取的進度。讀者嘗試讀取一個較大的網頁,看看百分比的更新情況。

  1. PageTask task = new PageTask();  

 

狼翔月影 發表在 痞客邦 PIXNET 留言(0) 人氣()