目录
前言
Async | Task
async [æˈsɪŋk] abbr. 异步,非同步 | 英 [tɑːsk] 美 [tæsk]n. (困难的)任务,工作;
AsyncTask,称为异步任务,属于原生类。它对Thread和Handler进行了封装,方便在子线程中执行耗时任务,然后将结果发送给主线程进行UI更新等操作。使用AsyncTask就可以不用关注Thread和Handler,因为AsyncTask内部会对其进行管理,我们就只需要关注我们的业务逻辑即可。
建议先看一遍——Android Handler机制使用,源码分析
一、AsyncTask基础
源码类如下:
//抽象类
public abstract class AsyncTask<Params, Progress, Result> {
//线程池类型
public static final Executor SERIAL_EXECUTOR = null;
public static final Executor THREAD_POOL_EXECUTOR = null;
public AsyncTask() {}
protected abstract Result doInBackground(Params... var1);
protected void onPreExecute() {}
protected void onPostExecute(Result result) {}
protected void onProgressUpdate(Progress... values) {}
protected final void publishProgress(Progress... values) { }
public final boolean isCancelled() {}
public final boolean cancel(boolean mayInterruptIfRunning) {}
protected void onCancelled() { }
...//省略
}
AsyncTask类中参数为3种泛型类型,控制AsyncTask子类执行线程任务时各个阶段的返回类型。如下所示:
- Params :开始异步任务执行时传入的参数类型,对应excute()中传递的参数
- Progress:异步任务执行过程中,返回下载进度值的类型
- Result :异步任务执行完成后,返回的结果类型,与doInBackground()的返回值类型保持一致
其中,Params用于AsyncTask调用execute()方法时传入后,依次执行下面其他方法。
二、使用步骤
第一步:
创建AsyncTask子类,继承AsyncTask类,为3个泛型参数指定类型;
若不使用,可用java.lang.Void类型代替
private class MyTask extends AsyncTask<Params, Progress, Result> {
//线程池对象
public static final Executor SERIAL_EXECUTOR = null;
public static final Executor THREAD_POOL_EXECUTOR = null;
//执行线程任务前的操作
@Override
protected void onPreExecute() {}
//接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果
@Override
protected String doInBackground(String... params) {
...// 自定义的线程任务
// 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()
publishProgress(count);
}
// 在主线程 显示线程任务执行的进度
@Override
protected void onProgressUpdate(Integer... progresses) {}
// 接收线程任务执行结果、将执行结果显示到UI组件
@Override
protected void onPostExecute(String result) { }
// 将异步任务设置为:取消状态
@Override
protected void onCancelled() {}
}
第二步:
创建AsyncTask子类的实例对象,AsyncTask子类的实例必须在UI线程中创建
MyTask mTask = new MyTask();
第三步:
手动调用execute(Param