AsyncTask的使用
AnsyncTask的简介
在Android中,我们更新UI的操作必须要在主线程(UI线程)中进行,而下载图片、文件这种操作必须要在子线程中进行,Android为我们提供了Handler机制,实现了子线程与主线程之间的通信。通常做法就是先new出一个子线程Thread在子线程中完成下载操作后,通过handler发送一条Message给主线程,主线程收到消息后,就可以进行UI的更新工作了,如下:
Handler mHadler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what == 1){
Bitmap bitmap = (Bitmap) msg.obj;
//更新UI...
}
}
};
private void download(){
new Thread(new Runnable() {
@Override
public void run() {
// 这里进行下载操作...获得了图片的bitmap
//下载完后才,向主线程发送Message
Message msg = Message.<em>obtain</em>();
msg.obj = bitmap;
msg.what = 1;//区分哪一个线程发送的消息
mHadler.sendMessage(msg);
}
}).start();
}
可以看到,每次要进行下载工作,我们就得先创建出Thread,然后在主线程中写好handler,为了对这个过程进行封装,Android提供了AsyncTask异步任务,AsyncTask对线程和handler进行了封装,使得我们可以直接在AsyncTask中进行UI的更新操作,就好像是在子线程进行UI更新一样。
AsncTask的参数
AsncTask一共指定了三个泛型参数类型,分别有以下响应的功能:
public abstract class AsyncTask<params,progress,result>
params 开始异步任务执行时传入的参数类型,即doInBackground()方法中的参数类型;
progress: 异步任务执行过程中,返回下载进度值的类型,即在doInBackground中调用publishProgress()时传入的参数类型;
result: 异步任务执行完成后,返回的结果类型,即doInBackground()方法的返回值类型;
AsncTask的回调方法
onPreExecute():在执行后台下载操作之前调用,运行在主线程中;
doInBackground():核心方法,执行后台下载操作的方法,必须实现的一个方法,运行在子线程中;
onPostExecute():后台下载操作完成后调用,运行在主线程中;
因此,AsyncTask的基本生命周期过程为:onPreExecute() —> doInBackground() —> onPostExecute()。其中,onPreExecute()和onPostExecute()分别在下载操作前和下载操作后调用,同时它们是在主线程中进行调用,因此可以在这两个方法中进行UI的更新操作,比如,在onPreExecute()方法中,将下载等待动画显示出来,在onPostExecute()方法中,将下载等待动画进行隐藏。