AsyncTask
AsyncTask
1. 什么是 AsyncTask
1.1 AsyncTask 是安卓提供的轻量异步类(抽象), 可以继承AsyncTask,在类中可以进行异步操作, 并提供接口反馈当前异步执行的程度或进度。
本质上就是一个封装了线程池和handler的异步框架,主要用来执行异步任务,由于集成了handler,通过handler发送消息,它很方便的在工作线程和UI线程之间切换
(最好做耗时比较短的,长的还是用线程池)
2. AsyncTask的使用方法
2.1 三个参数
1 | public abstract class AsyncTask<Params, Progress, Result> { |
Params:执行时传入的参数;
Progress:在后台执行时的进度;
Result:当任务执行完毕后的结果返回;
2.2 五个方法
耗时操作没进行前,在UI线程汇中调用onPreExecute();
1 |
|
在后台执行时调用doInBackground();计算结果必须有一个返回,并会被传到onPost()中;
也可以调用publishProgress();返回进度显示
@WorkerThread
protected abstract Result doInBackground(Params… params);
在每次onProgressUpdate()调用完后会执行onProgressUpdate();通过progressbar.setProgress(value)动态显示进度条;
1 |
|
最后所有doInBackground之后会通过result来传递给onPostExecute()并调用;
1 |
|
3. AsyncTask内部原理
3.1 AsyncTask的本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务, 这些任务都是提交到静态的线程池中执行;
3.2 线程池中的工作线程执行doInBackground(mParans)方法执行异步任务;
3.3 当任务状态改变之后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息, 并调用相关的回调函数;
4. AsyncTask注意事项
4.1 内存泄露
被声明为Activity的非静态的内部类,会持有外部类的引用;
设为静态 static;
或者持有弱引用;
或在外部onDestroy里用cancle;
4.2 生命周期
必须在activity生命周期销毁时销毁AsyncTask
4.3 结果丢失原因
如被杀掉,或者屏幕旋转时onPostExcute不会更新界面
4.4 并行OR串行
版本 | 执行方式 |
---|---|
<= 1.6 | 串行 |
>= 1.6 && < 2.3 | 并行 |
>= 2.3 | 串行 |