AsyncTask的简单使用

这里给出一个简单应用的实例,效果图如下:
在这里插入图片描述
点击按钮然后下方的文本开始进行颜色变换

我先来介绍一下AsyncTask这个类

AsyncTask这是一个抽象类,所以如果我们要使用,就必须要创建一个子类去继承它。在继承时我们可以为AsyncTask类指定3个泛型参数,这三个参数的用途如下:

params : 执行AsyncTask时需要传入的参数,可用于在后台任务中使用,也就是doInBackground()方法中的参数类型。

Progress : 后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型参数作为进度单位,也就是onProgressUpdate()方法中的参数类型。

Result : 第三个:当前任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型,也就是doInBackground()方法的返回类型。
注意:返回的数据作为参数传到了onPostExecute()方法中,所以也是onPostExecute()方法的参数类型。

继承AsyncTask类经常需要重写的4个方法:

onPreExecute() : 在后台任务开始之前调用,用于进行一些界面上的初始化操作。

doInBackground() : 这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理耗时任务。

onProgressUpdate() : 可在这个方法中更新UI元素。

onPostExecute() : 当后台任务执行完毕并通过return语句进行返回时,这个方法就会被调用返回的数据会作为参数传到此方法中。

现在我们来看看代码

MainActivity的布局代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp">

    <Button
        android:id="@+id/main_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="改变颜色"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/main_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:text="月中之影"
        android:textSize="40sp" />

</LinearLayout>

MainActivity的java代码如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_change;
    private TextView tv_content;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_change = findViewById(R.id.main_btn);
        tv_content = findViewById(R.id.main_tv);
        btn_change.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.main_btn) {
            // 启动这个任务
            new ChangeTextTask().execute();
        }
    }

    // AsyncTask的三个泛型参数分别是
    // 第一个:执行AsyncTask时需要传入的参数,可用于在后台任务中使用,也就是doInBackground()方法中的参数类型
    // 第二个:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型参数作为进度单位,也就是onProgressUpdate()方法中的参数类型
    // 第三个:当前任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型,也就是doInBackground()方法的返回类型
    // 注意:返回的数据作为参数传到了onPostExecute()方法中,所以也是onPostExecute()方法的参数类型
    class ChangeTextTask extends AsyncTask<Void, Integer, Void> {

        // 在后台任务开始之前调用,用于进行一些界面上的初始化操作
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        // 这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理耗时任务
        @Override
        protected Void doInBackground(Void... voids) {
            while (true) {
                try {
                    // 调用publishProgress()方法后,onProgressUpdate()方法很快就会被调用
                    // publishProgress()方法中如果传入了参数,那么这个参数传到了onProgressUpdate()方法中的values[0]
                    publishProgress(1);
                    // 休眠400毫秒
                    Thread.sleep(400);

                    publishProgress(2);
                    Thread.sleep(400);

                    publishProgress(3);
                    Thread.sleep(400);

                    publishProgress(4);
                    Thread.sleep(400);

                    publishProgress(5);
                    Thread.sleep(400);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }

        // 可在这个方法中更新UI元素
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);

            switch (values[0]) {
                case 1:
                    tv_content.setTextColor(Color.RED);
                    break;
                case 2:
                    tv_content.setTextColor(Color.YELLOW);
                    break;
                case 3:
                    tv_content.setTextColor(Color.BLUE);
                    break;
                case 4:
                    tv_content.setTextColor(Color.GREEN);
                    break;
                case 5:
                    tv_content.setTextColor(Color.GRAY);
                    break;
                default:
                    break;
            }

        }

        // 当后台任务执行完毕并通过return语句进行返回时,这个方法就会被调用
        // 返回的数据会作为参数传到此方法中
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值