一,什么是AsyncTask
二,AsyncTask的使用方法
三,AsyncTask的内部原理
四,AsyncTask的注意事项
一,什么是AsyncTask
意义:本质上是封装了线程池和handler的异步框架,来做耗时操作,因为封装了Handler,所以可以方便地在工作线程和子线程之间切换
二,AsyncTask的使用方法
1,三个参数(Integer:在执行AsyncTask时所要的参数,在后台任务时使用,Integer:在后台显示的进度,String:result,对结果进行返回)
2,5个方法:
onPreExecute():耗时操作前即开始线程前,做初始化操作
onInBackground():耗时后台计算----发到------->onPostExecute()
pulishprogress():发布进度单位
onProgressUpdate():动态显示进度条
onPostExecute():后台计算结果调用
三,机制原理
1,AsyncTask本质是静态线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是交到静态的线程池中执行。
2,线程池中的工作线程执行doInBackground(mParams)方法执行异步任务
3,当任务状态改变后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler会相应这些消息并调用相关的回调函数。
内部封装了线程池,通过mHandler发送消息,在UI线程,子线程中传递。
四,注意事项
1,内存泄漏
AsyncTask会被声明为Activity的非静态内部类,会持有外部Activity的引用。
2,生命周期
如果不主动cancel(),就仍存在,如果不进行处理,则会导致崩溃
3,结果丢失
场景:屏幕旋转,内存不够,被杀
此时AsyncTask会持有之前的引用,但这个引用已经无效了,所以说,用postExecute()更新界面也没有用,以上是AsyncTask()结果丢失的原因
4,并行或串行
安卓1.6以前,AsyncTask是串行,会把AllTask放入线程池中一串一串地执行,在1.6到3.0版本是并行,2.3以后改为了串行,但仍然可以并行(用Execute on Execute())
一般只用串行,可以保证线程池稳定,因为并发的话,线程池不稳,但效率高,AsyncTask一般做不了太高并发,高耗时的操作。