一、什麼是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對象傳進去