AsyncTask-异步任务
AsyncTask
构建AsyncTask子类的回调方法
AsyncTask主要有如下几个方法:
doInBackground:必须重写,异步执行后台线程要完成的任务,耗时操作将在此方法中完成.
onPreExecute:执行后台耗时操作前被调用,通常用于进行初始化准备操作.
onPostExecute:当doInBackground方法完成后,系统将自动调用此方法,并将doInBackground方法返回的值传入此方法.通过此方法进行UI的更新.
onProgressUpdate:当在doInBackground**方法中调用**publishProgress方法更新任务执行进度后,将调用此方法.通过此方法我们可以知晓任务的完成进度.
下面通过代码演示一个典型的异步处理的实例–加载网络图片.网络操作作为一个不稳定的耗时操作,从4.0开始就被严禁放入主线程中.所以在显示一张网络图片时,我们需要在异步处理中下载图片,并在UI线程中设置图片.
String url = '';
new MyAsyncTask().execute(url);//这里设置要传递进去的数据,可多个
class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {
@Override
protected void **onPreExecute**() {
super.onPreExecute();
pb.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
pb.setVisibility(View.GONE);
imageView.setImageBitmap(result);
}
@Override
protected Bitmap doInBackground(String... params) {
//获取传递进来的参数
String url = params[0];
Bitmap bm = null;
InputStream is;
try {
URLConnection conn = new URL(url).openConnection();
is = conn.getInputStream();
BufferedInputStream br = new BufferedInputStream(is);
bm = BitmapFactory.decodeStream(is);
is.close();
br.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bm;
}
new MyAsyncTask().execute();//没有要传递的参数
protected void onPause() {
super.onPause();
if(task != null && task.getStatus() == AsyncTask.Status.RUNNING){
task.cancel(true);//取消这个asynctask
}
}
class MyAsyncTask extends AsyncTask<Void, Integer, Void>{
@Override
protected Void doInBackground(Void... params) {
for(int i = 0; i<100 ;i++){
if(isCancelled()){
break;//获取线程状态,跳出循环
}
publishProgress(i);//把进度传到onProgressUpdate的values中
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if(isCancelled()){
return;//结束这个task
}
pb.setProgress(values[0]);//从values中拿出进度
}
}
.使用AsyncTask的注意事项
① 必须在UI线程中创建AsyncTask的实例.
② 只能在UI线程中调用AsyncTask的execute方法.
③ AsyncTask被重写的四个方法是系统自动调用的,不应手动调用.
④ 每个AsyncTask只能被执行(execute方法)一次,多次执行将会引发异常.
⑤ AsyncTask的四个方法,只有doInBackground方法是运行在其他线程中,其他三个方法都运行在UI线程中,也就说其他三个方法都可以进行UI的更新操作.