3.9学习内容-AsyncTask的定义和使用

一.什么是AsyncTask?

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

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

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

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

AsyncTask的泛型参数和常用方法

    AsyncTask的三种泛型参数:

    Params:启动任务执行的输入参数;

   Progress:后台任务执行的额百分比;

  Result:后台执行任务最终返回的结果。

   常用方法:

   onPreExecute:

   1.异步任务开始执行时,系统最先调用此方法;

  2.此方法运行在主线程中,可以对控件进行初始化等操作。

  doInBackground:

  1.执行完onPreExecute方法后,系统执行此方法。

 2.此方法运行在主线称中,比较耗时的操作放在此方法中执行。

  onProgressUpdate:

  1.显示当前进度,适用于下载或扫描这类需要实时显示进度的需求;

  2.此方法运行在主线程中,可以修改控件状态,例如:显示百分比;

  3.触发此方法,需要在doInBackground中使用publishProgress方法。

  publishProgress:

  1.在doInBackground中使用;

  2.用于触发onProgress方法

  onPostExecute:

  1.当异步任务执行完成后,系统会自动调用此方法;

  2.此方法运行在主线程中,可以修改控件状态,例如:下载完成。

二.如何使用AsyncTask?

AsyncTask的执行过程:UI线程 - 启动AsynsTask - 执行耗时操作 - 接受消息。

1.新建内部类继承AsykcTask;

2.定义AsyckTask的三种泛型参数;

3.重写doInBackground抽象方法;

4.重写onPostExecute方法;

5.重写onProgreeUpdate方法;

6.重写onPreExecute方法;

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

三.使用AsyncTask做倒计时(附代码)

public class MainActivity extends AppCompatActivity {
    private EditText timeet;
    private TextView timetv;
    private Button daojishibtn;


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

        bindID();

        daojishibtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int time=Integer.parseInt(timeet.getText().toString());//把int类型转换成String类型
                new MyTask().execute(time);
            }
        });
    }

    private void bindID() {
        timeet=findViewById(R.id.time_et);
        timetv=findViewById(R.id.time_tv);
        daojishibtn=findViewById(R.id.daojishi_btn);
    }


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

        @Override
        protected String doInBackground(Integer... Integer) {
            for(int i=Integer[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);
            timetv.setText("倒计时:"+values[0]);
        }

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

布局:

    <EditText
        android:id="@+id/time_et"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/time_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/daojishi_btn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="带进度AsyncTask倒计时"/>

</LinearLayout>
四.使用AsckyTask做进度条(附代码)
  <ProgressBar
        android:id="@+id/pb1"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100" />
    <ProgressBar
        android:id="@+id/pb2"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100" />

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="开始下载"/>
    <Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="开始下载"/>

    </LinearLayout>
布局:
public class Jindutiao extends AppCompatActivity implements View.OnClickListener{
    private Button btn1;
    private Button btn2;
    private ProgressBar pb1;
    private ProgressBar pb2;

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

        bindID();

    }

    private void bindID() {
        btn1=findViewById(R.id.btn1);
        btn2=findViewById(R.id.btn2);
        pb1=findViewById(R.id.pb1);
        pb2=findViewById(R.id.pb2);

        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);

        pb1.setMax(10);//设置最大值
        pb2.setMax(10);//设置最大值
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn1:
                btn1.setEnabled(false);
                btn1.setText("正在下载");
                new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,1);//改成并行
                break;
            case R.id.btn2:
                btn2.setEnabled(false);
                btn2.setText("正在下载");
                new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,2);//改成并行
                break;
        }
    }

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

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

            int whichpb=integers[0];//定义任意一个数两步

            for(int i=1;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:
                    pb1.setProgress(values[0]);
                    break;
                case 2:
                    pb2.setProgress(values[0]);
                    break;
            }
        }

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

            //定义选择两个下载按钮
            switch (integer){
                case 1:
                    btn1.setText("下载完成");
                    btn1.setEnabled(true);
                    break;
                case 2:
                    btn2.setText("下载完成");
                    btn2.setEnabled(true);
                    break;}
        }
    }
}

五.Excute和excuteOnExcutor的区别:

Excute实现的是串行,excuteOnExcutor实现的是并行。

六.更喜欢AsckyTask还是Handler,为什么?

  更喜欢AsckyTask,因为使用AsckyTask,简单,快捷,适用于下载,获取网络数据这样的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值