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

Android_實用技術(2)—— AsyncTask 使用方法,androidasynctask

編輯:關於android開發

Android_實用技術(2)—— AsyncTask 使用方法,androidasynctask


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

protected void onPreExecute() {
  super.onPreExecute();      // 可以進行一些預處理
}

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

直接看代碼:

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

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

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

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

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

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

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

protected void onPostExecute(Boolean b) {                                                         // b --> true
  if (b) {
     Toast.makeText(getBaseContext(), "Download succeed", Toast.LENGTH_SHORT).show();          // 後續操作
  } else {
    Toast.makeText(getBaseContext(), "Download failed", Toast.LENGTH_SHORT).show();
  }
}

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

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

protected void onCreate(Bundle savedInstanceState) {                  // 這個方法你不要說你不認識~
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  new DownloadTask().execute(100);                                  // 這樣就可以啟動異步類了
}

【後記】

小編盡可能的通過自己的理解和細致的模板讓Android愛好者看懂、看通,當然小編自己也是一個學習者,希望碼友們在學習的過程中發現問題、指正問題,我們共同學習,共同進步!

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved