Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android實用技術(2)—— AsyncTask 使用方法

Android實用技術(2)—— AsyncTask 使用方法

編輯:關於android開發

  AsyncTask作為一個比Handler好用的消息處理類,掌握它是必須的,廢話少說,直接往下看!

  -----------------------------------------------------------------------------------------------------------------

  AsyncTask 是一個抽象類(public abstract class AsyncTask extends Object),如果想使用它的話,我們必須創建一個子類去繼承它。

  看一下這個抽象類:android.os.AsyncTask<Params, Progress, Result>,指定了三個泛型參數,我們先分析一下這三個參數:

  1.  Params:在執行AsyncTask時需要傳入的參數,可用於在後台任務中使用,這麼說不懂?ok,下面代碼會告訴你怎麼用.

  new DownloadTask().execute(params) --> doInBackground(Integer... params)   // 這邊的Integer可以自定義

  2. Progress:後台任務執行時,如果需要在界面上顯示當前的進度,則使用這裡指定的泛型作為進度單位。

  3. Result:當任務執行完畢後,如果需要對結果進行返回,則使用這裡指定的泛型作為返回值類型,比如我們常使用Boolean或String類型作為返回類型。

  Notice:這三個參數是泛型參數,也就是說參數類型是根據要求傳入的,所以在方法的使用過程中,一定要清晰參數類型的設定和使用。

  這裡給出一個最簡單的自定義AsyncTask的方式:

  class DownloadTask extends AsyncTask<Void, Integer, Boolean> {

  ......

  }

  當然,定義完一個繼承AsyncTask的子類後,我們還需要覆寫AsyncTask的幾個方法:

  1.      onPreExecute()

  2.     doInBackground(Params...)

  3.     onProgressUpdate(Progress...)

  4.     onPostExecute(Result)

  下面,我們就這4個方法的使用流程作一個詳細的介紹:

  onPreExecute():這個方法顧名思義,就是在異步任務處理之前需要執行的操作,那麼它操作什麼?簡單的說就是進行一些界面上的初始化操作,比如:顯示一個進度條對話框等。這個方法不是我們的重點方法,但是在使用過程中巧妙使用可以增強界面的可觀性。

Java代碼
  1. protected void onPreExecute() {  
  2.   super.onPreExecute();      // 可以進行一些預處理  
  3. }  

  doInBackground(Params...):這個就是AsyncTask中最為重要的方法了,因為這個方法中的所有代碼都會在子線程中運行,我們也是在這個方法中去處理所有的耗時任務。

  直接看代碼:

Java代碼
  1. protected Boolean doInBackground(Integer... params) {      // 這邊params是由execute()傳進來的,這個execute方法可以在下面找到答案  
  2.   for (int i = 0; i < 101; i++) {  
  3.     publishProgress(i);                                 // 對主線程UI進行更新操作,將調用onProgressUpdate()方法  
  4.     try {  
  5.       Thread.sleep(params[0]);                        // 休眠線程  
  6.     } catch (Exception e) {  
  7.       e.printStackTrace();  
  8.     }  
  9.   }  
  10.   return true;                                           // 任務完成後return一個結果,這邊的Boolean類型的結果  
  11. }  

  通過以上的代碼,我們可以發現:任務一旦完成就可以通過return語句來將任務的執行結果返回,如果AsyncTask的第三個泛型參數被指定的是Void,就可以不返回任務執行結果。

  在這個方法中是不可以進行UI操作的(子線程是無法對主線程進行修改的),如果需要更新UI元素的話,就需要調用publishProgress(Progress...)方法來完成了。

  onProgressUpdate(Progress...):當在後台任務中調用了publishProgress(Progress...)方法後,這個方法就會很快被調用,此方法中的參數是從哪邊傳來的,我想不需要解釋了吧。

  在這個方法中,可以對UI進行操作,利用參數中的數值就可以對界面元素進行相應地更新,為什麼?上代碼!

Java代碼
  1. protected void onProgressUpdate(Integer... values) {                                  // values[0] = i  
  2.   MainActivity.this.text.setText("當前進度是:" + String.valueOf(values[0]) + "%");   // 主線程進行操作  
  3. }  

  onPostExecute(Result):這個函數就是來執行return返回後的一些操作的,我們直接看下代碼,就能理解。

Java代碼
  1. protected void onPostExecute(Boolean b) {                                                         // b --> true  
  2.   if (b) {  
  3.      Toast.makeText(getBaseContext(), "Download succeed", Toast.LENGTH_SHORT).show();          // 後續操作  
  4.   } else {  
  5.     Toast.makeText(getBaseContext(), "Download failed", Toast.LENGTH_SHORT).show();  
  6.   }  
  7. }  

  那麼,問題來了,我們定義好了類、同時覆寫了各種方法,但是如何啟動它?

  如果想要啟動這個任務,只需編寫一行代碼:new DownloadTask().execute();

Java代碼
  1. protected void onCreate(Bundle savedInstanceState) {                  // 這個方法你不要說你不認識~  
  2.   super.onCreate(savedInstanceState);  
  3.   setContentView(R.layout.activity_main);  
  4.   new DownloadTask().execute(100);                                  // 這樣就可以啟動異步類了  
  5. }
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved