AsyncTask的基本使用
步驟:
- 繼承AsyncTask
- 重寫
onPreExecute()
用來做一些初始準備工作,比如初始的Dialog提示
doInBackground()
用來執行耗時操作
onPostExecute()
耗時操作結束后調用(比如做一些取消Dialog的操作)
onProgressUpdate()
做一些耗時過程中的界面更新操作(調用publishProgress()
后才會被調用)
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重要函數之間的關系
AsyncTask重要函數思維導圖.png
AsyncTask在 Android3.0 前后的對比
3.0前:
- 可以同時有
5
個任務在執行 - 沒有SerialExecutor類,直接在AsyncTask中構建了一個sExecutor常量
規定同一時刻能夠運行的線程數5
、線程池大小128
3.0后:
- 默認同時只有
1
個任務在執行 - 新增了
Executor
類,默認使用的 SerialExecutor 內部用ArrayDeque(雙端隊列)管理多個Runnable對象(控制為單線程) - 更靈活,如果不想使用默認線程池,可以自由進行配置,使用其他的Executor,比如
Executor exec = new ThreadPoolExecutor(15, 200, 10,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
new DownloadTask().executeOnExecutor(exec);
上述代碼就可以允許同時有15
個任務執行,最多能存儲200
個任務
區別:
3.0前后的最大區別就是增加 Executor
類,原先的AsyncTask線程數、線程池是定死的,現在更靈活
,使用不同的Executor可以進行不同的配置。