目录
1. 定义
官方解释:AsyncTask可以正确及方便地使用UI线程。此类允许您执行后台操作并在UI线程上发布结果,而无需通过操作Thread和Handler。AsyncTasks应该用于短操作(最多几秒钟)。异步任务在后台线程运行计算,其结果在UI线程上发布。
1.1 AsyncTask 的三个泛形参数
java.lang.Object
↳ android.os.AsyncTask<Params, Progress, Result>
1. Params(传入参数):在执行 execute(Params... params) 任务方法时传入。
2. Progress(执行进度):在后台计算期间发布的进度单位。
3. Result(执行结果):后台的计算结果。 这三个参数不是每次都必须被定义使用,如果你不想使用,就定义为 Void。 如果三个参数都不使用,如下所以:
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
1.2 AsyncTask的4个核心方法
当 AsyncTask 被执行时,会经历4个步骤,分别是onPreExecute()、doInBackground()、onProgressUpdate()、onPostExecute()。 分别是:
1、onPreExecute():在 UI 线程上工作,在任务执行 doInBackground() 之前调用。此步骤通常用于设置任务,例如在用户界面中显示进度条。
2、doInBackground(Params...params):在子线程中工作,在 onPreExecute() 方法结束后执行,这一步被用于在后台执行长时间的任务,Params 参数通过 execute(Params) 方法被传递到此方法中。任务执行结束后,将结果传递给 onPostExecute(Result) 方法,同时我们可以通过 publishProgress(Progress) 方法,将执行进度发送给 onProgressUpdate(Progress) 方法。
3、onProgressUpdate(Progress...values):在 UI 线程上工作,会在 doInBackground() 中调用 publishProgress(Progress) 方法后执行,此方法用于在后台计算仍在执行时(也就是 doInBackgound() 还在执行时)将计算执行进度通过 UI 显示出来。例如,可以通过动画进度条或显示文本字段中的日志,从而方便用户知道后台任务执行的进度。
4、onPostExecute(Result result):在 UI 线程上工作,在任务执行完毕(即 doInBackground(Result) 执行完毕)并将执行结果传过来的时候工作。
1.3 取消任务
一个任务可以通过调用 cancel() 方法在任何时间取消。调用此方法后再调用 isCancelled() 方法,返回 true。调用此方法后,onPostExecute() 方法将在 onCancel() 方法返回后调用,而不是在 doInBackground() 返回结果后调用。为了确保任务被尽快取消,你应该在 doInBackground() 方法中进行周期性地检查 isCancelled() 的返回值,如果可能的话(例如在一个循环中进行检查),比如下面例子:
@Override
protected String doInBackground(String... strings) {
for (int i = 1; i <= 10; i++) {
···
//在for循环中进行周期性检查,检查异步任务是否被取消
if (isCancelled()) {
break;
}
···
}
···
return result;
}
2. 简单Demo上手
点击 Start AsyncTask 按钮,开始执行异步任务,点击 Stop AsyncTask 按钮,取消任务执行。效果如下所示:
2.1 Java 版本
详细代码:
public class AsyncTaskActivity extends AppCompatActivity implements View.OnClickListener {
private ProgressBar progressBar;
private TextView displayTv;
private Button startBtn, stopBtn;
private MyAsyncTask myAsyncTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super