AsyncTask详解
- 什么事AsyncTask
-
- AsyncTask的使用方法
- 三个参数(泛型指定的三个)
- 5个方法
- AsyncTask内部原理
- AsyncTask的注意事项
1.什么事AsyncTask
- 本质上是一个封装了线程池和handler的异步框架 ·
- 2 AsyncTask 可以使开发者避免使用Handler和Thread 来直接处理后台操作,执行异步任务,在子线程和UI线程灵活的切换
- 注意:AsyncTask只能做一些耗时比较短的操作,如果想做耗时比较长的操作,最好用线程池
2.AsyncTask的使用方法
- 三个参数(泛型指定的三个)
-
2.5个方法
图:
4
-
public class UpdateInfoAsyncTask extends AsyncTask<Integer,Integer,String>{
protected void onPreExecute(){
textView.setText("开始执行异步框架");
}
protected String doInBackground(Integer...params){//为什么是可变参数,说明可以传入过个参数,但是类型已经确定
int i = 0;
for(i=10;i<=100;i+=10){
publicProgress(i);
}
return i+ params[0].intValue()+"";
}
protected void onProgressUpdate(Integer... values){
int value = values[0];
progessBar.setProgess(value);
}
protected void onPostExecute(String result){
textView.setText("异步操作执行结束"+result);
}
}
参数1:执行操作传入
参数2:进度 返回
参数3:结果返回
onPreExecute 在UI线程中,开启进度条,提示等
doInBackground 在线程池中
publicProgress(i)会将参数 回调到onProgressUpdate
onPostExecute 回到UI线程中,处理结果
3.AsyncTask内部原理
-
熟悉Handler之后,可知android应用的主线程肩负着绘制用户界面,及时效应用户操作的重任,要确保不出现ANR,需时刻保持较高的响应
-
异步机制,本质上都是对Hanlder、线程、以及线程池的封装
-
框架整体结构:
- AsyncTask的本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行
- 线程池中的工作线程执行doInBackground(mParams)方法执行异步任务
- 当任务状态改变之后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相关的回调函数。
-
总结:内部是封装了线程池,通过handler来发送消息,在uI线程和子线程传递
-
4.AsyncTask的注意事项
-
- 内存泄露:原因跟handler差不多。
-
非静态内部类会持有外部类的引用,导致外部对象想被销毁时,因为被持有而无法被内存回收(内存泄露)
-
1.设置静态 2.持有弱引用外部对象 3.在ondestroy时执行cancel()方法
-
-
- 生命周期
- 线程池的操作咋会跟组件生命周期跟着走。。
-
- 结果丢失
- 界面旋转
- 被直接杀掉,如果是静态,AsyncTask会持有已经销毁的引用,这时线程池任务执行完之后调用onPostExecute方法更新界面,这是不会再生效
-
4.并行or串行
- 2.3之后 串行
- 有方法执行串行,线程池内部不稳定
- 内存泄露:原因跟handler差不多。
网友评论