Forver.微笑

面带微笑未必真的开心,但笑起的那一刻,心中的那些不开心的事已经不重要了~

0%

AsyncTask基础

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

参考文章

Android 多线程:AsyncTask的原理 及其源码分析