程序笔记   发布时间:2022-07-15  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了AsyncTask详解及简单示例大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

AsyncTask详解及示例

  • 总体概述
  • 使用方法
  • 一个简单的例子
    • 效果
    • 项目结构
    • activity_main.xml代码
    • MainActivity代码
    • SimpleAsyncTask代码
    • 进一步改进

总体概述

众所周知,程序的执行主要是在UI线程上执行(也就是主线程),当有耗时任务的时候,例如从网络上下载文件、进行数据库查询、进行复杂的逻辑运算的时候,如果在主线程中执行,会导致主线程阻塞,APP无法响应,asynctask是Android官方提供的帮助类,可以开启个独立线程执行某个耗时任务。

使用方法

AsyncTask是一个抽象类,如果使用必须用别的类来继承他。主要的方法如下:

方法作用线程
onPreExecute()程序执行前设置UI主线程
doInBackground()在后台执行的具体任务子线程
onProgressUpdate()程序执行过程中设置UI主线程
onPostExecute()程序执行完设置UI主线程

AsyncTask详解及简单示例

AsyncTask <Params, Progress, Result>
参数名称参数作用
ParamsdoInBackground()参数
ProgressonProgressUpdated()参数
ResultonPostExecute()参数

注意: 不需要写参数就写void doInBackground必须实现,其他方法可以不实现 onPostExecute使用的参数是doInBackground的返回值 doInBackground参数需要在构造AsyncTask时传入

一个简单的例子

点击按钮,文字变为Waiting,并且随机等待一段时间后,更新文字内容。 (随机等待一段时间模拟费时操作)

效果

AsyncTask详解及简单示例

项目结构

AsyncTask详解及简单示例

activity_main.xml代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    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:layout_margin="16dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="I am ready to start work!"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:onClick="startTask"
        android:text="Start Task"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView1"/>

</androidx.constraintlayout.widget.ConstraintLayout>

代码很好懂,Button绑定个事件,在MainActivity中进行实现。

MainActivity代码

public class MainActivity extends AppCompatActivity {
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到控件
        mTextView = this.findViewById(R.id.textView1);
    }

    public void startTask(View view) {
        mTextView.setText("Wait.......");
        //开始AsyncTask
        new SimpleAsyncTask(mTextView).execute();
    }
}

其他代码都很好懂,重点说一下这个:

new SimpleAsyncTask(mTextView).execute();

mTextView为什么传入,其实就是SimpleAsyncTask这个的构造函数所需要的参数,之后的execute就表示开始执行,因为onPreExecute不需要参数,所以这里不传入,根据情况传参。

SimpleAsyncTask代码

public class SimpleAsyncTask extends AsyncTask<Void, Integer, String> {
    private WeakReference<TextView> mTextView;

    SimpleAsyncTask(TextView tv) {
        //弱引用  可以被垃圾回收机制回收如果必要的话
        mTextView = new WeakReference<>(tv);
    }
    
    @Override
    protected String doInBackground(Void... voids) {
        Random r = new Random();
        int n = r.nextInt(11);
        int s = n * 200;
        try {
            Thread.sleep(s);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return "Awake at last after sleeping for " + s + " milliseconds!";
    }

    @Override
    protected void onPostExecute(String s) {
        // 参数String是doInBackground返回的参数
        // 因为是弱引用  必须用get方法获得具体的对象
        mTextView.get().setText(s);
    }
}

首先讲一下弱引用: 假如是普通的方法,当Activity被摧毁之后,对TextView的引用意味着Activity永远不会被垃圾回收机制回收,个人理解,因为你要用这个Activity,所以其不会被回收,会导致内存泄漏;弱引用,代表必要情况下可以被垃圾回收机制回收。

doInBackground–必须实现的方法 该代码中随机暂停一段时间后,返回字符串。

onPostExecute–在doInBackground执行完后执行 String参数正是doInBackground的返回值,并且这个是执行在UI线程上的,可以对UI进行更新。

进一步改进

在点击按钮之后,旋转屏幕,会发现UI无法正常更新,这是因为旋转屏幕重建了UI,但是AsyncTask会在后台正常运行,但是无法更新UI,若想正常更新,需要AsyncTaskLoader

可参考我的:(未来补上 哈哈哈哈)

大佬总结

以上是大佬教程为你收集整理的AsyncTask详解及简单示例全部内容,希望文章能够帮你解决AsyncTask详解及简单示例所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: