Android中的AsyncTask

什么是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方法:
①当异步任务执行完成后,系统会调用此方法
②此方法运行在主线程中,可以修改空间状态,例如:下载完成

什么是泛型参数

泛型泛型,我们从字面上的意思就能猜到个大概了,就比方说,int是什么类型的参数?大家都能回答是整型,所以这里的泛型指的是广泛、泛泛的意思,也就是什么类型都包括在内。
而在你新建内部类继承AsyncTask的时候里面的三个参数就是为泛型参数,也就是说这三个参数的类型是你自己可以定义的,这也就是泛型参数

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

@Override
        protected String doInBackground(String... strings)

就好比这段代码中的String…,它代表的是一个可延伸的参数,平常的String时,你只能传进去一个参数,而这个长度可变的参数列表时,就可以传入任意的个数,这也就是长度可变的参数列表

案例分析—-倒计时Demo

下面是展示完整的代码:

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class Main4Activity extends AppCompatActivity {
    private Button time_btn1;
    private TextView time_xs1;
    private int count=10;

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

        bindID();
        time_btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new DownloadTask().execute();
            }
        });
    }

    private void bindID() {
        time_btn1=findViewById(R.id.time_btn1);
        time_xs1=findViewById(R.id.time_xs1);
    }

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

        @Override
        protected String doInBackground(String... strings) {
            while (count>0){
                publishProgress(count+"");
                count--;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "下载完成";
        }

        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            time_xs1.setText(values[0]);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            time_xs1.setText(s);
        }
    }
}

第一步就是新建内部类继承AsyncTask:

class DownloadTask extends AsyncTask<String,String,String>

里面的三个参数也就是泛型参数,然后在其内部.重写doInBackground抽象方法,里面会自动运行一个子线程,这里的result传递到onPostExecute方法中的参数s然后通过setText显示出来

@Override
        protected String doInBackground(String... strings) {
            while (count>0){
                publishProgress(count+"");
                count--;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "下载完成";
        }

重写onProgressUpdate方法,进行更新UI,但是要用到publishProgress方法使用

@Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            time_xs1.setText(values[0]);
        }

重写onPostExecute方法,最后得到一个结果,执行完所有的方法之后,再将其得到的放在按钮的点击事件中去

@Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            time_xs1.setText(s);
        }
time_btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new DownloadTask().execute();
            }
        });

完成所有的步骤时也就完成了这个倒计时的小程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值