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重要函数思维导图.pngAsyncTask在 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可以进行不同的配置。
网友评论