Android AsyncTask使用说明
示例代码
我们先运行下如下代码,看下打印的log,然后再做说明
private void doTask() {
new AsyncTask<String, Integer, Boolean>() {
@Override
protected void onPreExecute() {
Log.d("MyAsyncTask", "onPreExecute:任务开始,线程" + Thread.currentThread().getName());
}
@Override
protected Boolean doInBackground(String... params) {
for (int i = 1; i <= 5; i++) {
String name = params[0];
try {
Log.d("MyAsyncTask", "doInBackground:" + name + "执行任务步骤" + i + ",线程" + Thread.currentThread().getName());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
return false;
}
publishProgress(i);
}
return true;
}
@Override
protected void onProgressUpdate(Integer... values) {
Log.d("MyAsyncTask", "onProgressUpdate:" + "完成任务步骤" + values[0] + ",线程" + Thread.currentThread().getName());
}
@Override
protected void onPostExecute(Boolean result) {
if (result) {
Log.d("MyAsyncTask", "onPreExecute:任务完成,线程" + Thread.currentThread().getName());
} else {
Log.d("MyAsyncTask", "onPreExecute:任务失败,线程" + Thread.currentThread().getName());
}
}
}.execute("野猿新一");
}
以上代码执行了一个后台任务,打印日志如下
2019-12-27 09:47:20.827 4138-4138/com.him.hisapp D/MyAsyncTask: onPreExecute:任务开始,线程main
2019-12-27 09:47:20.829 4138-4226/com.him.hisapp D/MyAsyncTask: doInBackground:野猿新一执行任务步骤1,线程AsyncTask #1
2019-12-27 09:47:21.829 4138-4226/com.him.hisapp D/MyAsyncTask: doInBackground:野猿新一执行任务步骤2,线程AsyncTask #1
2019-12-27 09:47:21.829 4138-4138/com.him.hisapp D/MyAsyncTask: onProgressUpdate:完成任务步骤1,线程main
2019-12-27 09:47:22.830 4138-4138/com.him.hisapp D/MyAsyncTask: onProgressUpdate:完成任务步骤2,线程main
2019-12-27 09:47:22.830 4138-4226/com.him.hisapp D/MyAsyncTask: doInBackground:野猿新一执行任务步骤3,线程AsyncTask #1
2019-12-27 09:47:23.830 4138-4138/com.him.hisapp D/MyAsyncTask: onProgressUpdate:完成任务步骤3,线程main
2019-12-27 09:47:23.831 4138-4226/com.him.hisapp D/MyAsyncTask: doInBackground:野猿新一执行任务步骤4,线程AsyncTask #1
2019-12-27 09:47:24.831 4138-4138/com.him.hisapp D/MyAsyncTask: onProgressUpdate:完成任务步骤4,线程main
2019-12-27 09:47:24.832 4138-4226/com.him.hisapp D/MyAsyncTask: doInBackground:野猿新一执行任务步骤5,线程AsyncTask #1
2019-12-27 09:47:25.832 4138-4138/com.him.hisapp D/MyAsyncTask: onProgressUpdate:完成任务步骤5,线程main
2019-12-27 09:47:25.833 4138-4138/com.him.hisapp D/MyAsyncTask: onPreExecute:任务完成,线程main
说明
AsyncTask<Params, Progress, Result>类中有三个泛型
- Params:execute()方法传入的参数类型,在doInBackground()方法的参数中接收,可以传递多个值
- Progress:publishProgress()方法的参数类型,在onProgressUpdate()方法中接收,可以传递多个值
- Result:doInBackground()方法的返回类型,在onPostExecute()方法中接收
主要方法介绍:
- onPreExecute():任务开始前执行,运行在主线程
- doInBackground():耗时后台任务在此方法中执行,运行在子线程
- onProgressUpdate():任务执行过程可以在doInBackground()方法内通过调用publishProgress()方法通知执行进度,onProgressUpdate()方法会接收到该进度,运行在主线程
- onPostExecute():任务执行完毕会调用该方法,运行在主线程