AsyncTask是个抽象类,因此需要创建继承它的具体类。具体类必需实现doInBackground()抽象方法,这是AsyncTask唯一的抽象方法。很多具体类也常会重写onPostExecute()方法,用来处理执行结果。
使用AsyncTask可以使代码清析整洁,它将工作线程代码与UI线程代码分离。
示例:
/*
AsyncTask的三个泛型参数说明(三个参数可以是任何类型)
第一个参数:传入doInBackground()方法的参数类型
第二个参数:传入onProgressUpdate()方法的参数类型
第三个参数:传入onPostExecute()方法的参数类型,也是doInBackground()方法返回的类型。
*/
public class DownloadFileTask extends AsyncTask<String, Integer, Long> {
/**
* 此方法在独立线程(双叫工作线程)中执行
*/
protected Long doInBackground(String... urls) {
Long totalSize = 0;
for (int i = 0; i < urls.length; i++) {
totalSize += downloadFile(urls[i]);
publishProgress((int)((i / (float)urls.length) * 100));//通知UI线程调用onProgressUpdate()方法
}
return totalSize;
}
/**
* 此方法在UI线程中执行
*/
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
/**
* 此方法在UI线程中执行
*/
protected void onPostExecute(Long totalSize) {
showDialog("Downloaded " + totalSize + " bytes");
}
}
使用规则:
1.实例必需用UI线程创建
2.实例的execute()方法必需用UI线程调用
3.不要手动调用onPreExecute()、onPostExecute()、doInBackground()和onProgressUpdate方法
4.实例只能执行一次(execute()方法),如果尝试调第二次将会抛异常