天天看點

AsyncTask的使用及注意事項

一、什麼是AsyncTask

AsyncTask(抽象類)其實就是安卓提供的輕量級的異步類,可以直接繼承AsyncTask,在類中實作異步操作,并提供接口回報目前異步執行的程度(可以通過接口實作UI進度更新),最後回報執行的結果給UI主線程.

AsyncTask本質上封裝了線程池和Handler的異步架構,用來執行異步任務的,讓你避免使用線程類Thread

二、AsyncTask的使用方法

AsyncTask定義了三種泛型類型 Params,Progress和Result。

Params 啟動任務執行的輸入參數,比如HTTP請求的URL。

Progress 背景任務執行的百分比。

Result 背景執行任務最終傳回的結果,比如String。

/**  
 * 生成該類的對象,并調用execute方法之後  
 * 首先執行的是onProExecute方法  
 * 其次執行doInBackgroup方法  
 *  
 */  
public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> {  

    private TextView textView;  
    private ProgressBar progressBar;  

    public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {  
        super();  
        this.textView = textView;  
        this.progressBar = progressBar;  
    }  


    /**  
     * 這裡的Integer參數對應AsyncTask中的第一個參數   
     * 這裡的String傳回值對應AsyncTask的第三個參數  
     * 該方法并不運作在UI線程當中,主要用于異步操作,所有在該方法中不能對UI當中的空間進行設定和修改  
     * 但是可以調用publishProgress方法觸發onProgressUpdate對UI進行操作  
     */  
    @Override  
    protected String doInBackground(Integer... params) {  
        NetOperator netOperator = new NetOperator();  
        int i = ;  
        for (i = ; i <= ; i+=) {  
            netOperator.operator();  
            publishProgress(i);  
        }  
        return i + params[].intValue() + "";  
    }  


    /**  
     * 這裡的String參數對應AsyncTask中的第三個參數(也就是接收doInBackground的傳回值)  
     * 在doInBackground方法執行結束之後在運作,并且運作在UI線程當中 可以對UI空間進行設定  
     */  
    @Override  
    protected void onPostExecute(String result) {  
        textView.setText("異步操作執行結束" + result);  
    }  

    //該方法運作在UI線程當中,并且運作在UI線程當中 可以對UI空間進行設定  
    @Override  
    protected void onPreExecute() {  
        textView.setText("開始執行異步線程");  
    }  

    /**  
     * 這裡的Intege參數對應AsyncTask中的第二個參數  
     * 在doInBackground方法當中,,每次調用publishProgress方法都會觸發onProgressUpdate執行  
     * onProgressUpdate是在UI線程中執行,所有可以對UI空間進行操作  
     */  
    @Override  
    protected void onProgressUpdate(Integer... values) {  
        int vlaue = values[];  
        progressBar.setProgress(vlaue);  
    }    
}  
           

三、AsyncTask的内部原理

1、AsyncTask本質上是一個靜态的線程池,AsyncTask實作的子類可以執行不同的異步任務,這些任務都是送出到線程池中進行執行。

2、線程池中的工作線程執行doInBackground()方法執行異步任務

3、當任務狀态改變之後,工作線程會通過Handler向UI線程發送消息。

四、AsyncTask的注意事項

1、記憶體洩漏

一般情況下AsyncTask會被聲明為Activity的非靜态内部類,是以AsyncTask會持有外部類Activity的引用,這時候Activity被銷毀了,而AsyncTask内部還在執行耗時操作,就導緻了Activity無法被記憶體回收。

2、生命周期、結果丢失

AsyncTask并不會随着Activity的銷毀而銷毀,由于AsyncTask内部正在執行耗時操作,如果沒有手動将AsyncTask執行個體cancel掉,他是不會随着Activity的銷毀而銷毀。基于這種情況,當Activity銷毀了(螢幕旋轉),而AsyncTask還在執行耗時操作,當執行完成時要重新整理UI,此時Activity已經不存在了,進而導緻崩潰,是以必須在onDestory()方法中調用cancel()方法銷毀AsyncTask.

3、并行or串行

AsyncTask預設時串行執行的,如果想要并行執行則可以調用AsyncTask的executeOnExecutor,把自己的MyThreadPoolExecutor對象傳進去

繼續閱讀