AsyncTask的使用

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()方法),如果尝试调第二次将会抛异常

 

你可能感兴趣的:(AsyncTask)