AsyncTask是一个封装好的轻量级的异步任务类。
AsyncTask是一个抽象的泛型类,它提供了Params、Progress和Result这三个泛型参数,其中Params表示参数的类型,Progress表示后台任务的执行进度和类型,而Result则表示后台任务的返回结果的类型,如果AsyncTask不需要传递具体的参数,那么这三个泛型参数可以用Void来代替。
作用
- 开启线程执行后台耗时任务
- 异步通信:将线程的执行结果传递给主线程,更新UI,保证线程安全
AsynTask的使用步骤
- 创建 AsyncTask 子类 & 根据需求实现4个核心方法
- onPreExecute 负责执行任务前的一些初始化工作
- doInBackground 执行耗时任务,调用publishProgress,将进度传递给onProgressUpdate方法
- onProgressUpdate 获取线程的执行进度
- onPostExecute 接收执行任务的结果,并将结果更新到UI
- onCancelled 取消任务时的回调
- 创建 AsyncTask子类的实例对象(即 任务实例)
- 手动调用execute()从而执行异步线程任务
AsyncTask使用中的常见问题
生命周期问题
AsynTask不绑定任何组件的生命周期,因此在Activity或Fragment的onDestroy方法中记得调用cancel方法
内存泄漏问题
如果AsyncTask被声明为Activity的非静态内部类,那么AsyncTask会保留一个对Activity的引用。如果Activity已经被销毁,AsyncTask的后台线程还在执行,它将继续在内存里保留这个引用,导致Activity无法被回收,引起内存泄漏。
因此,需要将AsyncTask声明为静态内部类,避免内存泄漏
结果丢失问题
屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity的重新创建,之前运行的AsyncTask会持有一个之前Activity的引用,这个引用已经无效,这时调用onPostExecute()再去更新界面将不再生效。
因此,需要在Activity恢复时,重启任务线程
AsyncTask原理
AsyncTask=线程池+Handler
- 2个线程池,用于线程调度,复用线程执行任务
- 任务队列线程池SerialExecutor:负责任务调度
- 执行线程池THREAD_POOL_EXECUTOR:执行具体的线层任务
- 1个Handler用于异步通信,消息传递
- InternalHandler