Android学习杂记(二):异步任务AsyncTask详解

学习了一段时间的android,对于异步任务机制还是一知半解,这次又碰到大量需要异步任务操作的代码,所以趁这个时间整理一下,加深一下认识。

AsyncTask是一个抽象类,在android.os包下,直接继承Object类,用于给创建的类继承。其完整类名和参数如下:

    AsyncTask

其中:

-Params:这是异步任务开始时传入的参数类型。

-Progress:异步任务在执行异步操作的时候的进度。

-Result:异步任务操作结束时返回的参数。

AsyncTask有几个方法需要重写,最主要最常用的从调用顺序来分为如下几个:

protect void onPreExecute():该方法是在AsyncTask.execute()方法之前调用,一般用于UI界面的刷新,如进度条的显示。翻看源码,在该方法前找到有 @MainThread 的标志,说明该方法在主线程执行。

protect abstract Result doInBackground(Params... params):在调用onPreExecute()方法之后,任务正式进入主要操作,该操作顾名思义,就是在后台进行操作,此时查看Android源码,会发现有 @WorkerThread 的标志,这意味着该方法不在主线程操作,故不会阻塞主线程。parmas 为异步任务操作输入的参数,注意是Params... 这是一个数组,若只传入单个参数,则需要调用params[0]即可得到该参数。在这个方法中,可以通过publishProgress(Progress... values)来调用onProgressUpdate()方法,进行进度的更新。

protect void onProgressUpdate(Progress... values):在刚刚那个方法之中,调用了publishProgress(Progress...)方法,此时系统调用onProgressUpdate(Progress...)方法,该方法也有 @MainThread 标志,故一般用于主界面的刷新,多用于进度条的刷新。

protect void onPostExecute(Result result):该方法是在任务操作结束时回调的函数,使用的参数是doInBackground()方法中返回的参数。

实例如下,创建一个类继承AsyncTask,

private class DownloadTask extends AsyncTask{

        ProgressDialog progressDialog;
        @Override
        protected void onPostExecute(String s)
        {
            super.onPostExecute(s);
            tv.setText(s);
            progressDialog.dismiss();

        }

        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
            progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setTitle("任务正在执行");
            progressDialog.setMax(100);
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog.setIndeterminate(false);
            progressDialog.show();
        }

        @Override
        protected void onProgressUpdate(Integer... values)
        {
            super.onProgressUpdate(values);
            progressDialog.setProgress(values[0]);
        }

        @Override
        protected String doInBackground(Void... params)
        {
            int i;
            for (i = 0; i < 100; i++)
            {
                try
                {
                    Thread.sleep(500);
                } catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
                publishProgress(i);
            }
            if (i == 100){
                return "成功";
            }else
                return "失败";
        }
    }

使用以下操作来进行异步任务:

DownloadTask task = new DownloadTask();
task.execute();

如实例所示,在onPreExecute()方法中进行主界面的更新,调出进度条对话框,显示进度条对话框,设置进度条的各个参数。然后系统调用doInBackground()方法,实现里面模拟下载的操作,利用一个Thread.sleep()方法时线程在每数一次数的时候休眠半秒,模拟下载的操作,与此同时,调用publishProgress()方法让系统调用onProgressUpdate()方法,传入Progress参数,实现onProgressUpdate()里面重写的操作。在操作结束,doInBackground()返回一个值时,系统调用onPostExecute()方法。

注意:onPreExecute(),doInBackground(),onProgressUpdate(),onPostExecute()方法只能由系统调用,不能自己调用,我们只需要调用AsyncTask.execute()和publicProgress()方法就可以了。

你可能感兴趣的:(Android)