本文出自博客Vander丶CSDN博客,如需转载请标明出处,尊重原创谢谢
博客地址:http://blog.csdn.net/l540675759/article/details/62264615
AsyncTask是什么?
AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后可以把执行的进度和最终结果传递给主线程,并且能够在主线程更新UI.
从实现上来说,AsyncTask封装了Thread和Handler,通过AsyncTask可以更加方便地执行后台任务以及在主线程中访问UI.但是AsyncTask并不适合进行特别耗时的后台任务.对于特别耗时的任务来说,建议使用线程池.
AsyncTask怎么用?
AsyncTask的参数介绍
AsyncTask是一个抽象的泛型类,它提供了Params、Progress、Result这个三个泛型参数。
public abstract class AsyncTask<Params, Progress, Result> {}
AsyncTask的主要方法介绍
onPreExecute()
在主线程中执行,在异步任务执行之前会被调用,用来做一些准备工作。
doInBackgroud(Params...params)
在子线程中执行,此方法用来执行异步任务,Params表示异步任务的输入参数。
注意,在此方法中可以通过publishProgress方法来更新任务的进度,publishProgress方法会调用onProgressUpdate方法。
另外此方法需要返回计算结果给onPostExecute()方法,如果Result参数为Void的情况下,可以返回null。
onProgressUpdate(Progress...values)
在主线程中执行,当后台任务的执行进度发生改变的时,此方法会被调用。
onPostExecute(Result result)
在主线程中执行,在异步任务执行完毕后,此方法会被调用,其Result参数是后台任务的返回值,即doInBackground的返回值。
上述四个方法是AsyncTask的核心方法,当AsyncTask被取消的时候,onCancelled()方法会被调用,这个时候onPostExecute()方法不会被调用.
AsyncTask的Demo测试
TestAsyncTask.java
package com.commonproject.aysnctask;
import android.os.AsyncTask;
import android.util.Log;
/**
* Created by SuperD on 2017/3/15.
* 异步任务的测试类
*/
public class TestAsyncTask extends AsyncTask<Integer, Integer, Void> {
private static final String TAG = "TestAsyncTask";
/**
* 当前方法在主线程(UI)线程执行
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d(TAG, "异步任务准备阶段");
Log.d(TAG, "当前线程 : " + Thread.currentThread().getId() + "");
}
/**
* 当前方法在线程池创建的子线程中执行.
*
* @param params
* @return
*/
@Override
protected Void doInBackground(Integer... params) {
int count = params.length;
for (int i = 0; i < count; i++) {
//做判断取消处理
if (isCancelled()) {
break;
}
try {
Log.d(TAG, "执行" + params[i]);
Log.d(TAG, "当前线程 : " + Thread.currentThread().getId() + "");
//展示执行进度
publishProgress((int) (i / ((float) count) * 100));
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 执行线程主线程
*
* @param values
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int progress = values[0];
Log.d(TAG, "当前执行进度" + "%" + progress);
Log.d(TAG, "当前线程 : " + Thread.currentThread().getId() + "");
}
/**
* 任务完成
* 执行线程 :主线程
*
* @param aVoid
*/
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
Log.d(TAG, "异步任务完成阶段阶段");
Log.d(TAG, "当前线程 : " + Thread.currentThread().getId() + "");
}
@Override
protected void onCancelled() {
super.onCancelled();
Log.d(TAG, "异步任务停止");
Log.d(TAG, "当前线程 : " + Thread.currentThread().getId() + "");
}
}
MainActivity.java
//执行测试的异步任务
new TestAsyncTask().execute(1,2,3,4,5);
然后观察打印结果,和上面的流程图会更好的AsyncTask的核心方法的执行过程。
参考文章
1.Android开发艺术探索 P391