1、什么是AsyncTask
本质上就是一个封装了线程池和Handler的异步框架,主要用来执行异步任务,其封装了异步任务,可以方便异步任务和UI线程之间的贴换
2、AsyncTask的使用方法
1)三个参数 【执行的参数,进度,返回的数据】
2)4个方法
onPreExecute():异步线程执行前,在UI线程执行
doInBackground():在异步线程中执行
onRrogressUpdate():更新进度
onPostExecute():在UI线程中执行,接受返回结果
3、AsyncTask机制原理
1)AsyncTask的本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行
2)线程池中的工作线程执行doInBackground(mParams)方法执行异步任务
3)当任务状态改变后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相关的回调函数
4、AsyncTask的注意事项
1)内存泄露:
原因,非静态内部类持有外部类引用,而AsyncTask还持有外部引用,导致Activity无法被正常回收,造成内存泄露
解决办法:
a AsyncTask内部持有外部activity的弱引用
b 把AsyncTask改为静态内部类
c 在Activity onDestory中执行AsyncTask.cancel
2)生命周期:
如果不主动调用cancel()方法,AsyncTask不会随着Activity的销毁而销毁
3)结果丢失:
丢失原因:屏幕旋转,或者由于内存不足Activity被杀掉,而AsyncTask持有之前Activity的引用,无法更新UI,导致结果丢失
4)并行or串行
并行:1.6-2.3的时候是并行
串行:有序执行
一般建议串行
网友评论