AsyncTask相关面试题

什么是AsyncTask?

AsyncTask(异步任务类),比Handler更轻量,更适合简单的异步操作
内部实现了对Thread和Handler的封装,方便后台线程操作后进行UI的更新
在用AsyncTask进行UI更新时,不用额外创建Handler,在AsyncTask内部已经封装了的几个方法

AsyncTask的使用方法?

AsyncTask有三个泛型参数,作用是控制AsyncTask的子类在执行线程任务时每个阶段的返回类型

方法 描述
Params 开始异步任务执行时传入的参数类型,对应execute()中传递的参数
Progress 异步任务执行过程中,返回任务进度值的类型
Result 异步任务执行完成后,返回的结果类型,与doInBackground()的返回值类型保持一致

AsyncTask还有5个方法

重写方法 描述
doinBackground() 在子线程执行耗时操作,执行完后有返回结果
onPreExecute() 在doinBackground执行前
onProgressUpdate() 在UI线程中更新doinBackground的执行进度
onPostExecute() 接收doinBackground执行完后的返回结果,并显示到界面上去 ,如果执行被取消则无法调用
onCancelled() 在执行被取消时调用

AsyncTask的机制原理?

  1. AsyncTask的本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行
  2. 线程池中的工作线程执行doInBackground(Params)方法执行异步任务
  3. 当任务状态改变之后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相关的回调函数

AsyncTask的注意事项

  1. 内存泄露
    如果AsyncTask被声明为Activity的非静态的内部类,那么AsyncTask会保留一个对创建了AsyncTask的Activity的引用。如果Activity已经被销毁,AsyncTask的后台线程还在执行,它将继续在内存里保留这个引用,导致Activity无法被回收,引起内存泄露。
  2. 生命周期
    Asynctask 的生命周期和他所在的activity 的生命周期不是一致的。AsyncTask提前结束的唯一方法是通过调用AsyncTask.cancel()进行取消。否则,由于不必要的后台线程会导致app阻塞的风险,或者内存泄露。
  3. 结果丢失
    屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity的重新创建,之前运行的AsyncTask会持有一个之前Activity的引用,这个引用已经无效,这时调用onPostExecute()再去更新界面将不再生效。
  4. 并行还是串行
    Android 1.6之前的版本,AsyncTask是串行的,在1.6至2.3的版本,改成了并行的。在2.3之后的版本又做了修改,可以支持并行和串行,当想要串行执行时,直接执行execute()方法,如果需要并行执行,则要执行executeOnExecutor(Executor)。

Android中的为什么要使用异步任务?

异步任务的主要是用于耗时操作的,防止UI线程出现ANR现象

AsyncTask不适合做什么?

AsyncTask并不合适进行特别耗时的后台操作,对于特别耗时的任务,还是建议使用线程池

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。