安卓中AsyncTask的基本使用

  • 使用场景介绍

在安卓开发中,我们经常需要访问互联网资源,这些访问是都需要在后台线程中去完成的,因为安卓的UI线程不允许执行耗时任务。然而,后台线程是不可以修改安卓的UI的,所以我们一般使用Handler去修改UI,这需要我们自己去创建新的线程。其实安卓中已经给我们提供好了一个AsyncTask类,这个类就用用来处理耗时任务的,所以我们使用这个类也可以完成同样的操作。

  • AsyncTask类介绍

AsyncTask是一个抽象类,我们需要继承这个类。这个类需要指定三个泛型参数,第一个指:我们启动任务时要传递的参数类型,第二个指:任务进度改变时返回的数据类型,第三个指:任务完成时返回的数据类型。并且我们一般都会实现其中的四个方法,如下:(其中doInBackground方法是必须实现的)



public class MyAsyncTask extends AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
      return null;
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
    }
}



这四个方法都是系统自动回调的,不需要用户手动调用,用户在使用这个类的时候如下:



MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute();



其中,execute()方法可以传递多个参数,参数的数目是任意的,类型则是第一个泛型指定的类型,(这里指定的是String)在doInBackground方法中,获取参数的形式为:params[0], params[1]...的形式。当用户调用execute()方法之后,系统便会回调doInBackground方法(注意,在此之前,系统先调用onPreExecute方法,用户可以根据自己的需要初始化一些其他的数据或UI)。任务完成之后,系统回调onPostExecute方法,返回值类型则是我们在第三个泛型指定。那么onProgressUpdate方法什么时候调用呢?也就是任务有了新的进度,在doInBackground方法中调用publishProgress(),系统就可以回调该方法,其中传递的参数也是任意个,类型则是第二个泛型指定的类型。到此,AsyncTask类的基本介绍就结束。

  • 取消任务

如果遇到需要取消任务的情况,怎么办呢?后台任务是无法直接结束掉的,我们可以调用myAsyncTask.cancel(true);这样只是把这个后台线程的状态改为了cancel,线程本身并没有停止,仅仅改变了他的状态,所以我们需要在doInBackground方法中判断线程的状态,如果是cancel,则直接return或break即可。



@Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        if (isCancelled()) {
            return null;
        }
        // 处理其他任务
        return "Data";
    }



 

  • 补充
  1. 必须在UI线程中创建AsyncTask的实例;
  2. 必须在UI线程中调用execute()方法;
  3. 重写的四个方法都是自动调用的,不用手动去调用;
  4. 每个AsyncTask只能被执行一次,多次执行则会发生异常;