AsyncTask的使用

1,什么是AsyncTask?

AsyncTask与Handler都是Android所提供的异步类。
AsyncTask直接继承于Object类,位于Android.os包中。
AsyncTask相比于Handler更加的简洁,代码更少。
AsyncTask可以忽略Looper,MessageQueue,Handler等复杂对象,更便捷完成异步耗时操作。

2,如何使用AsyncTask?

1,新建内部类继承AsyncTask
2,定义AsyncTask的三种泛型参数
3,重写onPreExecute方法(开始前相当于主线程,不是必须的)
4,重写doInBackground抽象方法,(放过程的地方)
5,重写onProgressUpda(更新的地方,不是必须的)
6,重写onPostExecute方法(结束的地方)
7,在需要启动的地方调用execute方法

3,使用AsyncTask做倒计时。

AsyncTask的xml,有可输入的EditText,和可修改的TextView,以及一个Button。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.abc.myapplication.AsyncActivity">

    <LinearLayout
        android:id="@+id/async_rll1"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="设置时间"
            android:textSize="30sp" />

        <EditText
            android:id="@+id/async_edi"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textSize="30sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="秒"
            android:textSize="30sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="倒计时:"
            android:textSize="30sp" />


        <TextView
            android:id="@+id/async_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text=""
            android:textSize="30sp" />
        </LinearLayout>

        <Button
            android:id="@+id/async_btn"
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:text="开始计时"
            android:textSize="15sp" />

    </LinearLayout>
</RelativeLayout>

xml的效果展示:
这里写图片描述

AsyncTask的Activity通过 publishProgress()调用onProgressUpdate()方法来更新。

package com.example.abc.myapplication;

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

public class AsyncActivity extends AppCompatActivity {

    private EditText edi;
    private Button btn;
    private TextView tv;
    private int time;

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

        btn.setOnClickListener(new View.OnClickListener() {//监听
            @Override
            public void onClick(View view) {
                time = Integer.parseInt(edi.getText().toString());//将字符串转换成整形
                new AsyncDemo().execute(time);//新建AsyncDemo输将time带带入
            }
        });
    }

    private void bindID() {//绑定Id
        edi = findViewById(R.id.async_edi);
        btn = findViewById(R.id.async_btn);
        tv = findViewById(R.id.async_tv);
    }

    class AsyncDemo 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 "执行完成";//结束跳到onPostExecute
        }

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

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

}
4,使用AsyncTask做进度条。

AsyncTask做进度条的xml,可以用style来变更ProgressBar类型。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.abc.myapplication.MainActivity">

    <ProgressBar
        android:id="@+id/main_pro1"
        android:layout_width="match_parent"
        android:layout_height="10dp"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        />
    <ProgressBar
        android:id="@+id/main_pro2"
        android:layout_width="match_parent"
        android:layout_height="10dp"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        />
    <Button
        android:id="@+id/main_btn1"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="1点击下载"
        android:textSize="30sp"/>
    <Button
        android:id="@+id/main_btn2"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="2点击下载"
        android:textSize="30sp"/>

</LinearLayout>

Activity展示:

package com.example.abc.myapplication;

import android.os.AsyncTask;
import android.support.annotation.IntegerRes;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn1;
    private Button btn2;
    private ProgressBar pro1;
    private ProgressBar pro2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindID();
    }

    private void bindID() {
        btn1=findViewById(R.id.main_btn1);
        btn2=findViewById(R.id.main_btn2);
        pro1=findViewById(R.id.main_pro1);
        pro2=findViewById(R.id.main_pro2);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.main_btn1:
                DownloadTask d1=new DownloadTask();
                d1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,1);
                //并行用executeOnExecutor加载最多五个(串行的用execute)
                //传入的值(x,y)x就是后面的integers[0],y就是values[1]
                //0是第一个值,1是第二个值)(不过这里的integers[0]也是第二个参数)
                btn1.setText("正在下载");
                btn1.setEnabled(false);//点击后按键变为不可按
                break;
            case R.id.main_btn2:
                DownloadTask d2=new DownloadTask();
                d2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,2);
                btn2.setText("正在下载");
                btn2.setEnabled(false);
                break;
                default:
                    break;
        }
    }

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

        @Override
        protected String doInBackground(Integer... integers) {
            String result=integers[0]+"";
            //将int类型转换成字符串(integers[0]就是指传进来的值得第一位)
            for (int i=0;i<=10;i++){
                try {
                    Thread.sleep(1000);//睡眠一秒
                    publishProgress(i,integers[0]);//更新进度跳到onProgressUpdate()
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return result;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            int flag=values[1];//新建int类型接收第二个值
            switch (flag){//用switch来判断传进来的值第二个值是1还是2.
                case 1:
                    pro1.setProgress(values[0]*10);
                    break;
                case 2:
                    pro2.setProgress(values[0]*10);
                    break;
                    default:
                        break;
            }

        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            int flag= Integer.parseInt(s);
            switch (flag){
                case 1:
                    btn1.setText("下载完成");
                    btn1.setEnabled(true);//完成后按键变为可按
                    break;
                case 2:
                    btn2.setText("下载完成");
                    btn2.setEnabled(true);
                    break;
                    default:
                        break;
            }

        }
    }

}

效果展示(同步下载):
这里写图片描述

5,Execute()和executeOnExecutor()有何区别?

Execute()可以使进度条成类似串联一个接着一个完成。
executeOnExecutor()可以使进度条成类似并联的状态同时进行不过最多可以承受五个。

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

AsyncTask和Handler各有不同的优缺点。
AsyncTask:
优点:简单,快捷。
缺点:在多个异步消息需要处理时会变得复杂。
Handler:
优点:结构清晰,功能定义明确
缺点:在处理多个任务时更加的清晰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值