• <form id="qkrj8"></form>
    <wbr id="qkrj8"></wbr>

  • AsyncTask解決Android UI堵塞問題

    [來源] 達內    [編輯] 達內   [時間]2012-12-05

    onProgressUpdate(Progress...), 運行于UI線程。如果在doInBackground(Params...)中使用了publishProgress(Progress...),就會觸 發這個方法。在這里可以對進度條控件根據進度值做出具體的響應

      平時我們在開發Android程序時遇到較耗時任務的處理,如I/O訪問的數據庫操作、網絡訪問等情況時造成UI假死等問題,通過 AsyncTask可以很好的解決這個問題,就今天以在Android中執行Downloader.downloadFile(url),可能會堵塞整個 界面。顯然這會影響用戶體驗,我們如何解決這個問題呢?

      方法一、

      創建一個新的線程執行我們的任務,使用Thread類,在 run(){}中寫入任務代碼,比如:

      new Thread(new Runnable() {

      public void run() {

      Downloader.downloadFile(url);

      }

      }).start();

      但使用Thread會產生一些意想不到的問題,需要程序員用更多的代碼手動的維護它。

      方法二: Android SDK為我們提供了一個后臺任務的處理工具AsyncTask。AsyncTask就是一個封裝過的后臺任務類顧名思義就是異步任務,方便我們維 護,Android開發網提示這樣的好處可以解決一些線程安全問題,AsyncTask直接繼承于Object類,位置為 android.os.AsyncTask。要使用AsyncTask工作我們要提供三個泛型參數,并重載四個方法(至少重載一個)。

      三個泛型:

      Param ,任務執行器需要的數據類型

      Progress 后臺計算中使用的進度單位數據類型

      Result 后臺計算返回結果的數據類型

      有些參數是可以設置為不使用的,只要傳遞為Void型即可,比如AsyncTask

      四個步驟:

      onPreExecute(),執行預處理,它運行于UI線程,可以為后臺任務做一些準備工作,比如繪制一個進度條控件。

      doInBackground(Params...), 后臺進程執行的具體計算在這里實現,doInBackground(Params...)是AsyncTask的關鍵,此方法必須重載。在這個方法內可以 使用publishProgress(Progress...)改變當前的進度值。

      onProgressUpdate(Progress...), 運行于UI線程。如果在doInBackground(Params...)中使用了publishProgress(Progress...),就會觸 發這個方法。在這里可以對進度條控件根據進度值做出具體的響應。

      onPostExecute(Result),運行于UI線程,可以對后臺任務的 結果做出處理,結果就是doInBackground(Params...)的返回值。此方法也要經常重載,如果Result為null表明后臺任務沒有 完成(被取消或者出現異常)。

    資源下載

    ?