一、什么是AsyncTask
本质上就是一个封装了线程池和handler的异步框架,主要是用来执行异步任务的,由于内部集成了Handler,可以很灵活在主线程与工作线程(子线程)间切换,将后台任务执行的结果,返回到UI线程处理并更新UI界面。
二、AsyncTask的使用方法
/**
*
* public abstract class AsyncTask<Params, Progress, Result>
* AsyncTask是个泛型类,有三个泛型参数
* Params:参数的类型
* Progress:后台任务执行的进度的类型
* Result:后台任务执行的最终结果值
*
*/
@SuppressLint("StaticFieldLeak")
private class DownloadAsyncTask extends AsyncTask<Integer,Integer,String>{
/**
* 在主线程中执行,在异步任务执行之前调用,一般是用来做一些准备工作
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d(TAG, "onPreExecute: ");
}
/**
*在线程池中执行,用于后台执行异步任务
* @param integers
* @return 返回的结果将发送onPostExecute方法中
*/
@Override
protected String doInBackground(Integer... integers) {
String text="";
for (int i = 0; i <=5 ; i++) {
text=Integer.toString(i);
/*当需要更新进度条,调用publishProgress方法会onProgressUpdate方法
* 原理是通过Handler发送消息,当接受了对应的消息并会调用onProgressUpdate方法。
* */
publishProgress(i);
Log.d(TAG, "doInBackground: "+i);
try {
//模拟网络加载
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return text;
}
/**
* 在主线程中运行,当后台任务执行结果有变化会调用此方法,前提在doInBackground方法必须调用了
* publishProgress方法才会执行。
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Log.d(TAG, "onProgressUpdate: "+values[0]);
}
/**
* 在主线程中运行,当异步任务执行结束后,会调用此方法,并把doInBackground最终值返回给
* onPostExecute中
*/
@Override
protected void onPostExecute(String aLong) {
super.onPostExecute(aLong);
Log.d(TAG, "onPostExecute: "+aLong);
}
}
以上代码调用new DownloadAsyncTask().execute(),输出的结果如下:
03-08 15:26:42.164 2386-2386/com.pos.handler D/HandlerActivity: onPreExecute:
03-08 15:26:42.173 2386-2413/com.pos.handler D/HandlerActivity: doInBackground: 0
03-08 15:26:42.187 2386-2386/com.pos.handler D/HandlerActivity: onProgressUpdate: 0
03-08 15:26:42.265 2386-2413/com.pos.handler D/HandlerActivity: doInBackground: 1
03-08 15:26:42.266 2386-2386/com.pos.handler D/HandlerActivity: onProgressUpdate: 1
03-08 15:26:42.357 2386-2413/com.pos.handler D/HandlerActivity: doInBackground: 2
03-08 15:26:42.358 2386-2386/com.pos.handler D/HandlerActivity: onProgressUpdate: 2
03-08 15:26:42.446 2386-2413/com.pos.handler D/HandlerActivity: doInBackground: 3
03-08 15:26:42.447 2386-2386/com.pos.handler D/HandlerActivity: onProgressUpdate: 3
03-08 15:26:42.533 2386-2413/com.pos.handler D/HandlerActivity: doInBackground: 4
03-08 15:26:42.546 2386-2386/com.pos.handler D/HandlerActivity: onProgressUpdate: 4
03-08 15:26:42.623 2386-2413/com.pos.handler D/HandlerActivity: doInBackground: 5
03-08 15:26:42.624 2386-2386/com.pos.handler D/HandlerActivity: onProgressUpdate: 5
03-08 15:26:42.714 2386-2386/com.pos.handler D/HandlerActivity: onPostExecute: 5
三、AsyncTask的机制原理
- AsyncTask的本质是一个静态的线程池,asycnTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行
- 线程池中的工作线程(子线程)执行doInBackground方法执行异步任务
- 当任务状态发生改变之后,工作线程会向UI线程发送消息,AsyncTask内部的Handler会响应这些消息,并调用相关的回调函数。