要点:
- 安卓处理异步任务两种方法:Handler、AsyncTask。Handler在前一篇笔记中已经记录。相对来说,AsyncTask对于异步任务处理要更加灵活,尤其是复杂多线程情况;
- AsyncTask执行步骤:
2.1 先继承AsyncTask<Params, Progress, Result>抽象类,它有三个参数,分别代表:启动任务输入的参数,后台任务进度,任务完成后返回结果。这三个参数属于泛型,具体Integer、String等,由用户自定义,但要和其子函数进行对应。
2.2 主线程中调用execute(Params... params)启动任务,注意这里的Params参数类型和2.1中对应,...代表可任意多个参数。
2.3 execute执行后,会调用onPreExecute(),此函数可对UI进行操作
2.4 接着doInBackground(Params... params)运行与后台,进行耗时操作。此函数中可接受execute传过来的参数。且可调用publishProgress(Progress... values),传递进度。
2.5 publishProgress被调用后,会调用onProgressUpdate(Progress... values),这里可以对UI进行操作更新进度。同样Progress... values和前面对应。
2.6 最后,当doInBackground执行完后,其会返回一个Result,并调用onPostExecute(Result result),在此函数中可对结果进行处理,并更新UI。
2.7 AsyncTask在执行过程中,可在主线程中,调用cancel(true)函数进行取消异步任务。调用该函数后,会调用onCancelled()函数,在该函数中可更新UI。
主线程
//实例化异步class,传进去一个imageView和一个progressBar
MyAsyncTask task = new MyAsyncTask(imageView,progressBar);
//启动任务,1000是传给线程的参数,这里随便写的
task.execute(1000);
异步任务类
public class MyAsyncTask extends AsyncTask<Integer,Integer,String>{
private ImageView imageView;
private ProgressBar progressBar;
public MyAsyncTask(ImageView imageView,ProgressBar progressBar){
this.imageView = imageView;
this.progressBar = progressBar;
}
@Override
protected String doInBackground(Integer... params) {
MyThread mThread = new MyThread();
for(int i=0;i<=100;i+=10){
mThread.delayThread();
publishProgress(i);
}
return null;
}
@Override
protected void onPostExecute(String result) {
imageView.setImageResource(R.drawable.people4);
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
imageView.setImageResource(R.drawable.people1);
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... values) {
progressBar.setProgress(values[0]);
}
}
参考:
1、http://blog.csdn.net/liuhe688/article/details/6532519/
2、http://www.runoob.com/w3cnote/android-tutorial-ansynctask.html