AsyncTask的介绍及使用
https://blog.csdn.net/qq_37321098/article/details/81625580
- AsyncTask抽象类的3参数
- AsyncTask可以实现的函数
- 常用公共函数
- AsyncTask的使用要点
一、AsyncTask介绍
AsyncTask可以用来处理一些后台较耗时的任务,查看源码发现其内部就是一个Handler和线程池的封装,可以帮助我们处理耗时任务的同时去更新UI。但是特别耗时的任务还是建议使用线程池
1. AsyncTask抽象类的3参数
public abstract class AsyncTask<Params, Progress, Result> {
......
}
Params: 启动任务执行的输入参数,比如下载URL
Progress: 后台任务执行的百分比,比如下载进度
Result: 后台执行任务最终返回的结果,比如下载结果
2. 继承AsyncTask可以实现的函数
1. onPreExecute():
(运行在UI线程中) (非必须方法,可以不用实现)
在任务没被线程池执行之前调用,通常用来做一些准备操作,比如下载文件任务执行前,在这个方法中显示一个进度条。
2. doInBackground(Params... params):
(运行在子线程中)(此函数是抽象函数必须实现)
在任务被线程池执行时调用 ,可以在此方法中处理比较耗时的操作,比如下载文件等等
在其中可以通过调用publishProgress方法更新任务进度,publish方法回调onProgressUpdate方法
返回计算结果给onPostExecute方法
3. onProgressUpdate(Progress... values)
(运行在UI线程中) (非必须方法,可以不用实现)
后台任务的执行进度发生改变时调用
4.onPostExecute(Result result)
(运行在UI线程中) (非必须方法,可以不用实现)
此函数代表任务在线程池中执行结束了,给UI主线程的返回结果。比如下载结果。
5. onCancelled(Result result)
任务关闭回调的函数
3. 常用公共函数
1.cancel (boolean mayInterruptIfRunning)
尝试取消这个任务的执行(如果这个任务已经结束或者已经取消或者不能被取消或者某些其他原因,那么将导致这个操作失败)
2.execute (Params... params)
用指定的参数来执行此任务
- 可以在子线程执行(API26)
因为AsyncTask中的Handler还是用主线程中的Looper对象来实例化的,所以handler的handleMessage消息还是会发到主线程中。
在子线程中创建AsyncTask实例,执行execute()方法,在哪个线程执行AsyncTask的execute(),onPreExecute会运行在执行在那个线程中,onPostExecute方法还是会执行在主线程中,doInBackground方法会执行在AsyncTask创建的线程中。- 调用此方法采用串行执行任务
3.executeOnExecutor(Executor exec,Params... params)
用指定的参数行此任务,并运行在指定的线程池中
- 可以在子线程执行(API26)
- 调用此方法采用并行执行任务(Android 3.0以上)
4.getStatus ()
获得任务的当前状态 PENDING(等待执行)、RUNNING(正在运行)、FINISHED(运行完成)
5.isCancelled ()
在任务正常结束之前能成功取消任务则返回true,否则返回false
二、AsyncTask的使用要点
1. AsyncTask对象可以在主线程或者子线程创建(API26+)
因为默认用主线程的Looper作为参数创建Handler
private static Handler getMainHandler() {
synchronized (AsyncTask.class) {
if (sHandler == null) {
sHandler = new InternalHandler(Looper.getMainLooper());
}
return sHandler;
}
}