初学者对AsyncTask浅解

什么是AsyncTask

1.AsyncTask是android提供的轻量级的异步类
2.为了降低异步通信的开发难度,提供了AsyncTask
3.AsyncTask直接继承于Object,位于android.os包中
4.使用AsyncTask可以忽略looper,MessageQueue,Handler等复杂对象,更便捷的完成异步耗时操作。

如何使用AsyncTask

1.内部类继承AsyncTask;
2.定义AsyncTask的三种泛型参数;
3.重写doInBackground抽象方法
4.重写onPreExecute方法
5.重写onProgressUpdate方法
6.重写onPostExcute方法
7.在需要启动的地方调用execute方法

使用AsyncTask做倒计时

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

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                textView.setText("开始倒计时");
                time=Integer.parseInt(editText.getText().toString());//把字符串转换为int类型
                new MyTask().execute();
            }
        });




    }

    private void bindID() {
        editText=findViewById(R.id.daojishi_et);
        textView=findViewById(R.id.daojishi_tv);
        button=findViewById(R.id.daojishi_btn);
    }

    class MyTask extends AsyncTask<Integer,Integer,String>{
        @Override
        protected String doInBackground(Integer... integers) {

            for (int i=time;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);
            textView.setText(values[0]+"");
        }

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

使用AsyncTask做进度条

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.ProgressBar;

public class Main5Activity extends AppCompatActivity implements View.OnClickListener{


    private ProgressBar p1;
    private ProgressBar p2;
    private Button b1;
    private Button b2;


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



        bindID();



    }

    private void bindID() {
        p1=findViewById(R.id.p1);
        p2=findViewById(R.id.p2);
        b1=findViewById(R.id.b1);
        b2=findViewById(R.id.b2);

        p1.setMax(10);
        p2.setMax(10);

        b1.setOnClickListener(this);
        b2.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {

        switch (view.getId()){

            case R.id.b1:
                b1.setText("正在下载");
                b1.setEnabled(false);
                new MyTask().execute();
                break;
            case R.id.b2:
                break;

                default:
                    break;
        }

    }


    class MyTask extends AsyncTask<Integer,Integer,Integer>{
        @Override
        protected Integer doInBackground(Integer... integers) {

            for (int i=0;i<=10;i++){

                try {
                    Thread.sleep(1000);
                    publishProgress(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return 1;
        }



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


        @Override
        protected void onPostExecute(Integer integer) {
            super.onPostExecute(integer);
            b1.setText("下载完成");
            b1.setEnabled(true);
        }
    }
}

Execute和exectueOnExector

Execute

1.启动异步任务,调用此方法时,AsyncTask中的方法会被系统逐一调用。execult方法必须在UI线程中调用,AsyncTask在3.0之后,使用AsyncTask方法同时启动多个任务,将按照先后顺序逐一执行。

excultOnExecultor

excultOnExecultor方法必须在UI线程中调用,使用execultOnexecultor方法可以并行执行多个任务,最多也只能是5个任务同时执行。

更喜欢AsyncTask还是更喜欢Handler,为什么?

相比较而言,对于现在的我更喜欢AsyncTasK。因为使用AsyncTask我们不要需要对子线程进行相关的操作,可以直接继承AsyncTask。AsyncTask是有明显的缺点:就是最大并发数不超过5个。但对于现在的我们来说只需要能够熟练使用AsyncTask做一些小程序,并没有对于AsyncTask进行过于深入的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值