和使用匿名线程相比较来说 AsyncTask 有如下好处:
· 线程的开销较大,如果每个任务都要创建一个线程,那么应用程 序的效率要低很多;
· 线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。
· 另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。
AsyncTask定义了三种泛型类型 Params,Progress和Result。
· Params 启动任务执行的输入参数,比如HTTP请求的URL。
· Progress 后台任务执行的百分比。
· Result 后台执行任务最终返回的结果,比如String。
class LoadingTask extends AsyncTask<Void, Integer, Void>{
//需要长时间阻塞处理的任务
@Override
protected Void doInBackground(Void... params) {
// 实现任务的执行工作
// 线程中的处理,这儿不能操作UI
Log.i(TAG,"LoadingTask--doInBackground:");
publishProgress(0);
try {
Thread.sleep(1000 * 5); //5秒后
}
catch (Exception e) {
e.printStackTrace();
}
publishProgress(50);
try {
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(100);
Log.i(TAG,"LoadingTask--doInBackground:"+params);
return null;
//publishProgress(); //调用这个函数好后会激活onProgressUpdate()事件
}
@Override
protected void onCancelled() {
Log.i(TAG,"LoadingTask--onCancelled:");
super.onCancelled();
}
// 线程内更新处理
@Override
protected void onProgressUpdate(Integer... values) {
// 这边用于处理线程未完成的提示处理,例如进度条更新
pBar.setProgress(values[0]);
Log.i(TAG,"LoadingTask--onProgressUpdate:");
super.onProgressUpdate(values);
}
// 线程启动初始化操作
@Override
protected void onPreExecute() {
// 任务启动,比如显示一个提示框或进度条
Log.i(TAG,"LoadingTask--onPreExecute:");
}
// 阻塞任务执行完后的清理工作
@Override
protected void onPostExecute(Void v) {
// 线程处理结束,操作UI,关闭提示框或者关闭进度条
pBar.setVisibility(View.INVISIBLE);
Log.i(TAG,"LoadingTask--onPostExecute:");
}
}
· onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。
· doInBackground(Params…) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
· onProgressUpdate(Progress…) 此方法在主线程执行,用于显示任务执行的进度。
· onPostExecute(Result) 此方法在主线程执行,任务执行的结果作为此方法的参数返回。