关于AsyncTask的学习与使用

一、AsyncTask的定义

由字面意思可知,AsyncTask的意思就是异步任务的意思。与我们上次学的Handler有异曲同工之妙。

  • AsyncTask是Android提供的轻量级即实现代码量少的异步类;
  • 为了降低异步通信的开发难度,提供了AsyncTask;
  • AsyncTask直接继承于Object类,位于android.os包中;
  • 使用AsyncTask可以忽略Looper,MessageQueue,Handler等复杂对象,更快捷的完成异步耗时工作。

二、AsyncTask的使用步骤

  • 新建一个内部类继承AsyncTask;
  • 定义AsyncTask的三种泛型参数;
  • 重写四种方法,分别是重写onPreExecute方法,doinBackground抽象方法,onProgressUpdate方法和重写PostExecute方法;
  • 在需要启动的地方调用execute方法;

注意点:除了doinBackground抽象方法是在子线程里执行的,其他的都是在主线程里执行的。


三、Execute()和ExecuteOnExecutor的区别

Execute()方法是串行,即使用此方法同时启动多个任务时,必须按先后顺序逐一执行;而ExecuteOnExecutor方法则是并行,即使用此方法可以同时启动多个任务,但最多也只能是5个方法同时执行。

四、 更喜欢AsyncTask还是更喜欢Handler,为什么

我的看法:两个方法都是处理异步消息的方法,都各有千秋。就我个人而言,都差不多,没有喜欢的也没有讨厌的,都可以。

五、使用AsyncTask做倒计时(附代码)

1.首先在layout布局文件中创建EditText,TextView,Button三个控件

<EditText
        android:id="@+id/daojishi_et1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <TextView
        android:id="@+id/daojishi_tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="15dp"
        android:textSize="20sp"
        android:text="倒计时" />

    <Button
        android:id="@+id/daojishi_btn1"
        android:layout_width="90dp"
        android:layout_height="50dp"
        android:text="开始计时" />

2.然后在主体中定义这些控件,绑定ID

private EditText daojishiET;
    private TextView daojishiTV;
    private Button daojishiBtn;
 private void bindID() {
        daojishiET=findViewById(R.id.daojishi_et1);
        daojishiTV=findViewById(R.id.daojishi_tv1);
        daojishiBtn=findViewById(R.id.daojishi_btn1);
    }

3.随后就是给Button控件设置监听事件

  daojishiBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int time=Integer.parseInt(daojishiET.getText().toString());
                new MyTask().execute(time);
            }
        });

4.再然后就是创建一个MyTask类来继承AsyncTask,实现doInBackground方法,onProgressUpdate方法和onPostExecute方法

 class MyTask extends AsyncTask<Integer, Integer, String> {

        @Override
        protected String doInBackground(Integer... integers) {
            for(int i=integers[0];i>0;i--){
                try {
                    Thread.sleep(1000);
                    publishProgress(i);//调用onProgressUpdate方法
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "计时结束";
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            daojishiTV.setText(values[0]+"");
        }

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

AsyncTask方法的启动在第三步完成了。
以上就是使用AsyncTask做倒计时的全部注释和代码

六、使用AsyncTask做进度条(附代码)

1.首先在layout布局里创建两个ProgressBar和两个Button控件

<ProgressBar
        android:id="@+id/bar_pb"
        android:paddingTop="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"/>
    <ProgressBar
        android:id="@+id/bar_pb2"
        android:paddingTop="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"/>
    <Button
        android:id="@+id/down_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始下载" />
    <Button
        android:id="@+id/down_btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始下载2"/>

2.然后在主体里定义这些控件,绑定ID,为两个Button控件设置监听,同时设置两个ProgressBar最大长度为10

 private ProgressBar barShow;
    private ProgressBar barShow2;
    private Button downBtn;
    private Button downBtn2;
 private void bindID() {
        barShow=findViewById(R.id.bar_pb);
        barShow2=findViewById(R.id.bar_pb2);
        downBtn=findViewById(R.id.down_btn);
        downBtn2=findViewById(R.id.down_btn2);

        downBtn.setOnClickListener(this);
        downBtn2.setOnClickListener(this);

        barShow.setMax(10);
        barShow2.setMax(10);
    }

3.然后为两个Button控件设置点击时间,要注意的是用了switch语句来进行判断看点击了哪个Button按钮

 public void onClick(View view) {
        switch (view.getId()){
            case R.id.down_btn:
                downBtn.setEnabled(false);
                downBtn.setText("正在下载");
                new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,1);
                break;
            case R.id.down_btn2:
                downBtn2.setEnabled(false);
                downBtn2.setText("正在下载");
                new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,2);
                break;
        }
    }

4.再然后就是创建一个MyTask类来继承AsyncTask,实现doInBackground方法,onProgressUpdate方法和onPostExecute方法。在后两个方法里都同时使用了switch判断语句来看ProgressBar根据Button异步,以及下载完成后两个Button控件分别变成下载完成

 class MyTask extends AsyncTask<Integer,Integer,Integer>{

        @Override
        protected Integer doInBackground(Integer... integers) {

            int whichPb=integers[0];

            for(int i=0;i<=10;i++){
                try {
                    Thread.sleep(1000);
                    publishProgress(i,whichPb);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return whichPb;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);

            switch (values[1]){
                case 1:
                    barShow.setProgress(values[0]);
                    break;
                case 2:
                    barShow2.setProgress(values[0]);
                    break;
            }
        }

        @Override
        protected void onPostExecute(Integer integer) {
            super.onPostExecute(integer);

            switch (integer){
                case 1:
                    downBtn.setText("下载完成");
                    downBtn.setEnabled(true);
                 break;
                case 2:
                    downBtn2.setText("下载完成");
                    downBtn2.setEnabled(true);
                    break;
            }



        }
    }

AsyncTask方法的启动在第三步完成了。要注意的是启动方法改为executeOnExecutor了
以上就是使用AsyncTask做进度条的全部注释和代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值