Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> AsyncTask解決Android UI堵塞問題

AsyncTask解決Android UI堵塞問題

編輯:初級開發

平時我們在開發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<Params, Progress, Result>。要使用AsyncTask工作我們要提供三個泛型參數,並重載四個方法(至少重載一個)。

三個泛型:
Param ,任務執行器需要的數據類型
Progress 後台計算中使用的進度單位數據類型
Result 後台計算返回結果的數據類型
有些參數是可以設置為不使用的,只要傳遞為Void型即可,比如AsyncTask<Void, Void, Void>

四個步驟:
onPreExecute(),執行預處理,它運行於UI線程,可以為後台任務做一些准備工作,比如繪制一個進度條控件。
doInBackground(Params...),後台進程執行的具體計算在這裡實現,doInBackground(Params...)是AsyncTask的關鍵,此方法必須重載。在這個方法內可以使用publishProgress(Progress...)改變當前的進度值。
onProgressUpdate(Progress...),運行於UI線程。如果在doInBackground(Params...)中使用了publishProgress(Progress...),就會觸發這個方法。在這裡可以對進度條控件根據進度值做出具體的響應。
onPostExecute(Result),運行於UI線程,可以對後台任務的結果做出處理,結果就是doInBackground(Params...)的返回值。此方法也要經常重載,如果Result為null表明後台任務沒有完成(被取消或者出現異常)。


AsyncTask實例代碼:

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("android123下載測試 " + result + " bytes");
     }
 }
在Activity中我們這樣使用它:
 try{
         new DownloadFilesTask ().execute(url);
        
    }catch (Exception e) {
         Log.e("error", e.toString());
   }

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