什么是AsyncTask?

1.AsyncTask是Android提供的轻量级(实现代码量少)的异步类。

2.为了降低异步通信的开发难度,提供了AsyncTask。

3.AsyncTask直接继承于Object类,位于android.os包中。

4.使用AsyncTask可以忽略Looper、MessageQueue、Handler等复杂对象,更便捷的完成异步耗时操作。

AsyncTask的执行过程 

UI线程→启动AsyncTask→执行耗时操作→接收消息


如何使用AsyncTask?

使用AsyncTask步骤:

1.新建内部类继承AsyncTask。

2.定义的三种泛型参数。

3.重写doInBackground抽象方法。

4.重写onPreExecute方法。

5.重写onProgressUpdate方法。

6.重写inPostExecute方法。

7.在需要启动的地方调用execute方法。 

值得注意的是,这七个步骤当中4,5,6三个步骤并不是必须的,而步骤3则是一定要有的;


需要实现的几个方法

1.onPreExecute方法: 
①异步任务开始执行时,系统最先调用此方法。 
②此方法运行在主线程中,可以对控件进行初始化等操作

2.doInBackground方法: 
①执行完onPreExecute方法后,系统执行此方法 
②此方法运行在子线程中,比较耗时的操作放在此方法中执行

3.onProgressUpdate方法: 
①显示当前进度,适用于下载或扫描这类需要实时显示进度的需求 
②此方法运行在主线程中,可以修改控件状态,例如:显示百分比 
③触发此方法,需要在doinBackground中使用publishProgress方法

4.PublishProgress方法: 
①在DoInBackground中使用 
②用于触发onProgressUpdate方法

5.onPostExecute方法: 
①当异步任务执行完成后,系统会调用此方法 

②此方法运行在主线程中,可以修改空间状态,例如:下载完成



什么是泛型参数

泛型指的是广泛、泛泛的意思,也就是什么类型都包括在内。 

而在你新建内部类继承AsyncTask的时候里面的三个参数就是为泛型参数,也就是说这三个参数的类型是你自己可以定义的,这也就是泛型参数


什么是长度可变的参数列表

类型后面三个点(String…),是从Java 5开始,Java语言对方法参数支持一种新写法,叫可变长度参数列表,其语法就是类型后跟…,表示此处接受的参数为0到多个Object类型的对象,或者是一个Object[]。例:

public void back(int... ints){

    }

案例——使用AsyncTask的倒计时Demo

主要步骤:

创建一个DownloadTask继承AsyncTask


class DownloadTask extends AsyncTask<Message, Message, Message> {

        @Override
        protected Message doInBackground(Message... messages) {

            return null;
        }
    }
在doInBackground中添加逻辑,创建一个while循环
protected Message doInBackground(Message... messages) {
            while (i > 0) {
                msg.obj = String.valueOf(i);
                publishProgress(msg);
                i--;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            msg.obj = "倒计时结束";
            return msg;
        }
添加onProgressUpdate方法,用于显示while循环中的数据
protected void onProgressUpdate(Message... values) {
            super.onProgressUpdate(values);
            Message message = values[0];
            String data = (String) message.obj;
            download_tv.setText("" + data);
        }
添加onPostExecute,最后显示”倒计时结束”
protected void onPostExecute(Message message) {
            super.onPostExecute(message);
            String data = (String) message.obj;
            download_tv.setText("" + data);
        }
然后实例化这个类
i = Integer.parseInt(download_et.getText().toString());        //获取用户输入的值
                new DownloadTask().execute();


完整代码:


private TextView download_tv;
    private EditText download_et;
    private Button download_btn;
    private int i;
    private Message msg = new Message();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bindId();
    }

    private void bindId() {
        download_tv = findViewById(R.id.download_tv);
        download_et = findViewById(R.id.download_et);
        download_btn = findViewById(R.id.download_btn);
        download_btn.setOnClickListener(this);
    }

    class DownloadTask extends AsyncTask<Message, Message, Message> {

        @Override
        protected Message doInBackground(Message... messages) {
            while (i > 0) {
                msg.obj = String.valueOf(i);
                publishProgress(msg);
                i--;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            msg.obj = "倒计时结束";
            return msg;
        }

        @Override
        protected void onProgressUpdate(Message... values) {
            super.onProgressUpdate(values);
            Message message = values[0];
            String data = (String) message.obj;
            download_tv.setText("" + data);
        }

        @Override
        protected void onPostExecute(Message message) {
            super.onPostExecute(message);
            String data = (String) message.obj;
            download_tv.setText("" + data);
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.download_btn:
                i = Integer.parseInt(download_et.getText().toString());        //获取用户输入的值
                new DownloadTask().execute();
                break;
            default:
                break;
        }
    }
}