avatar

Catalog
Android的AsyncTask抽象类

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>

  1. params 开始异步任务执行时传入的参数类型,即doInBackground()方法中的参数类型;

  2. progress: 异步任务执行过程中,返回下载进度值的类型,即在doInBackground中调用publishProgress()时传入的参数类型;

  3. result: 异步任务执行完成后,返回的结果类型,即doInBackground()方法的返回值类型;

AsncTask的回调方法

  1. onPreExecute():在执行后台下载操作之前调用,运行在主线程中;

  2. doInBackground():核心方法,执行后台下载操作的方法,必须实现的一个方法,运行在子线程中;

  3. onPostExecute():后台下载操作完成后调用,运行在主线程中;

因此,AsyncTask的基本生命周期过程为:onPreExecute() —> doInBackground() —> onPostExecute()。其中,onPreExecute()和onPostExecute()分别在下载操作前和下载操作后调用,同时它们是在主线程中进行调用,因此可以在这两个方法中进行UI的更新操作,比如,在onPreExecute()方法中,将下载等待动画显示出来,在onPostExecute()方法中,将下载等待动画进行隐藏。

Author: kim yhow
Link: http://yoursite.com/2017/09/21/Android的AsyncTask抽象类/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶