AsyncTask的基本使用
步驟:
- 繼承AsyncTask
- 重寫
onPreExecute()
用來做一些初始準備工作,比如初始的Dialog提示
doInBackground()
用來執(zhí)行耗時操作
onPostExecute()
耗時操作結(jié)束后調(diào)用(比如做一些取消Dialog的操作)
onProgressUpdate()
做一些耗時過程中的界面更新操作(調(diào)用publishProgress()后才會被調(diào)用)
class DownLoadAsyncTask extends AsyncTask<Void, Integer, Boolean> {
int downLoad = 0;
ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.setProgress(0);
progressDialog.setMax(100);
progressDialog.setTitle("下載中");
progressDialog.show();
Log.d(TAG, "onPreExecute");
}
@Override
protected Boolean doInBackground(Void... voids) {
while (true) {
try {
Thread.sleep(500);
downLoad += 1;
publishProgress(downLoad);
Log.d(TAG, "downLoad = " + downLoad);
if (downLoad >= 20) {
break;
}
} catch (InterruptedException e) {
return false;
}
}
return true;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressDialog.setMessage("" + values[0]);
Log.d(TAG, "onProgressUpdate");
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
progressDialog.cancel();
Log.d(TAG, "onPostExecute");
}
}
AsyncTask重要函數(shù)之間的關(guān)系

AsyncTask重要函數(shù)思維導(dǎo)圖.png
AsyncTask在 Android3.0 前后的對比
3.0前:
- 可以同時有
5個任務(wù)在執(zhí)行 - 沒有SerialExecutor類,直接在AsyncTask中構(gòu)建了一個sExecutor常量
規(guī)定同一時刻能夠運行的線程數(shù)5、線程池大小128
3.0后:
- 默認同時只有
1個任務(wù)在執(zhí)行 - 新增了
Executor類,默認使用的 SerialExecutor 內(nèi)部用ArrayDeque(雙端隊列)管理多個Runnable對象(控制為單線程) - 更靈活,如果不想使用默認線程池,可以自由進行配置,使用其他的Executor,比如
Executor exec = new ThreadPoolExecutor(15, 200, 10,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
new DownloadTask().executeOnExecutor(exec);
上述代碼就可以允許同時有15個任務(wù)執(zhí)行,最多能存儲200個任務(wù)
區(qū)別:
3.0前后的最大區(qū)別就是增加 Executor 類,原先的AsyncTask線程數(shù)、線程池是定死的,現(xiàn)在更靈活,使用不同的Executor可以進行不同的配置。