什么是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的机制原理?
- AsyncTask的本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行
- 线程池中的工作线程执行doInBackground(Params)方法执行异步任务
- 当任务状态改变之后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相关的回调函数
AsyncTask的注意事项
- 内存泄露
如果AsyncTask被声明为Activity的非静态的内部类,那么AsyncTask会保留一个对创建了AsyncTask的Activity的引用。如果Activity已经被销毁,AsyncTask的后台线程还在执行,它将继续在内存里保留这个引用,导致Activity无法被回收,引起内存泄露。 - 生命周期
Asynctask 的生命周期和他所在的activity 的生命周期不是一致的。AsyncTask提前结束的唯一方法是通过调用AsyncTask.cancel()进行取消。否则,由于不必要的后台线程会导致app阻塞的风险,或者内存泄露。 - 结果丢失
屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity的重新创建,之前运行的AsyncTask会持有一个之前Activity的引用,这个引用已经无效,这时调用onPostExecute()再去更新界面将不再生效。 - 并行还是串行
Android 1.6之前的版本,AsyncTask是串行的,在1.6至2.3的版本,改成了并行的。在2.3之后的版本又做了修改,可以支持并行和串行,当想要串行执行时,直接执行execute()方法,如果需要并行执行,则要执行executeOnExecutor(Executor)。
Android中的为什么要使用异步任务?
异步任务的主要是用于耗时操作的,防止UI线程出现ANR现象
AsyncTask不适合做什么?
AsyncTask并不合适进行特别耗时的后台操作,对于特别耗时的任务,还是建议使用线程池