Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android異步加載全解析之使用AsyncTask

Android異步加載全解析之使用AsyncTask

編輯:關於Android編程

Android異步加載全解析之使用AsyncTask

概述

既然前面提到了多線程,就不得不提到線程池,通過線程池,不僅可以對並發線程進行管理,更可以提高他們執行的效率,優化整個App。當然我們可以自己創建一個線程池,不過這樣是很煩的,要創建一個高效的線程池還是挺費事的,不過,Android系統給我嗎提供了AsyncTask這樣一個類,來幫助我們快速實現多線程開發,它的底層實現,其實就是一個線程池。

AsyncTask初探

AsyncTask,顧名思義就是用來做異步處理的。通過AsyncTask,我們可以非常方便的解決多線程,以及多線程之間的通信問題。

AsyncTask參數

抽象類AsyncTask具有三個泛型參數:
AsyncTask 

Params: 這個泛型指定的是我們傳遞給異步任務執行時的參數的類型Progress: 這個泛型指定的是我們的異步任務在執行的時候將執行的進度返回給UI線程的參數的類型Result: 這個泛型指定的異步任務執行完後返回給UI線程的結果的類型 我們在創建AsyncTask的時候,需要指定這三個參數。

AsyncTask方法

AsyncTask具有這樣幾個抽象方法:
onPreExecute(): 這個方法是在執行異步任務之前的時候執行,並且是在UI Thread當中執行的,通常我們在這個方法裡做一些UI控件的初始化的操作, 例如彈出ProgressDialog doInBackground(Params... params): 在onPreExecute()方法執行完之後,會馬上執行這個方法,這個方法就是來處理異步任務的方法, Android操作系統會在後台的線程池當中開啟一個worker thread來執行我們的這個方法,所以這個方法是在worker thread當中執行的, 這個方法執行完之後就可以將我們的執行結果發送給我們的最後一個 onPostExecute 方法,因此,doInBackground是這四個方法中唯一必須要重寫的方法, 在這個方法中,我們可以從網絡當中獲取數據等一些耗時操作 onProgressUpdate(Progess... values): 這個方法也是在UI Thread當中執行的,我們在異步任務執行的時候,有時候需要將執行的進度返回給我們的UI界面, 例如下載一張網絡圖片,我們需要時刻顯示其下載的進度,就可以使用這個方法來更新我們的進度。這個方法在調用之前, 我們需要在 doInBackground 方法中調用一個 publishProgress(Progress) 的方法來將我們的進度時時刻刻傳遞給 onProgressUpdate 方法從而來更新進度 onPostExecute(Result... result): 當我們的異步任務執行完之後,就會將結果返回給這個方法,這個方法也是在UI Thread當中調用的, 我們可以將返回的結果顯示在UI控件上

AsyncTask使用

現在回到我們的例子中,我們利用AsyncTask來下載圖像,當然,下載圖像的方法還是使用那個getBitmapFromUrl()方法。首先,我們先寫一個ASyncDownloadImage類,繼承AsyncTask:
private class ASyncDownloadImage extends AsyncTask {

    private ImageView imageView;
    private String url;

    public ASyncDownloadImage(ImageView imageView, String url) {
        this.imageView = imageView;
        this.url = url;
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        return getBitmapFromUrl(params[0]);
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);
        if (imageView.getTag().equals(url)) {
            imageView.setImageBitmap(bitmap);
        }
    }
}

這個AsyncTask我們重寫了doInBackground用來異步下載圖像,重寫了onPostExecute來將圖像設置到ImageView上。因此,我們將AsyncTask的三個泛型參數設置為:
AsyncTask

即參數類型為String——url,進度類型——Void 不需要,返回類型——Bitmap 下載的圖像。在設置圖像的時候,我們同樣需要通過tag來進行判斷。 最後,我們與使用多線程一樣,創建一個showImageByASync方法,來調用AsyncTask:
/**
 * Using ASyncTask
 * @param imageView
 * @param url
 */
public void showImageByASync(ImageView imageView, String url) {
    ASyncDownloadImage task = new ASyncDownloadImage(imageView, url);
    task.execute(url);
}

AsyncTask中有幾個地方還是需要注意下的:execute方法只能在UI線程中調用AsyncTask實例也必須在UI線程中創建AsyncTask的抽象方法不要手動去調用,系統自動會去管理AsyncTask只能執行一次 最後,只需要將Adapter中的getView方法的mImageLoader.showImageByThread(viewHolder.imageView, url);改為如下所示即可:
mImageLoader.showImageByASync(viewHolder.imageView, url);
最後,顯示當然是沒有問題,就不貼圖了。

 




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