Android中的AsyncTask

news2025/1/20 3:35:58

近期写了一个项目,在前台刷新界面的时候需要操作数据库,进行数据操作,在UI线程更新数据会导致ANR,程序十分卡,因此用了AsyncTask进行后台数据处理。

介绍

AsyncTask是一个用于在后台线程执行异步任务并在主线程更新UI的类。它是在Android API Level 3中引入的,并被广泛使用。

下面是一个简单的AsyncTask的示例:

public class MyTask extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        // 后台执行耗时操作
        return "result";
    }

    @Override
    protected void onPostExecute(String result) {
        // 在UI线程更新UI
    }
}

AsyncTask定义了三个泛型参数:

  • Params:指定异步任务执行时传入的参数类型。
  • Progress:指定异步任务执行过程中用于更新UI的进度的类型。
  • Result:指定异步任务执行完成后返回的结果类型。

在上面的示例中,ParamsVoid,即没有传入参数,ProgressVoid,即没有进度更新,ResultString,即返回一个字符串结果。

基本结构

AsyncTask是一个抽象类,它的实现需要通过继承它并实现其抽象方法来完成。它的定义如下:

public abstract class AsyncTask<Params, Progress, Result> {
    // ...
}

其中,ParamsProgressResult是泛型参数,分别对应异步任务执行时传入的参数类型、进度更新的类型和返回的结果类型。

AsyncTask定义了一些静态常量,如SERIAL_EXECUTORTHREAD_POOL_EXECUTORDEFAULT_EXECUTOR等。这些常量表示了AsyncTask可以使用的线程池类型,其中SERIAL_EXECUTOR是一个串行线程池,THREAD_POOL_EXECUTOR是一个固定大小的线程池,DEFAULT_EXECUTOR是默认的线程池。

执行流程

AsyncTask的执行流程可以分为以下几个阶段:

  1. onPreExecute():在UI线程中执行,用于在异步任务执行前进行一些准备工作,例如显示进度条等。
  2. doInBackground(Params...):在后台线程中执行,用于执行耗时操作,不可以更新UI。
  3. onProgressUpdate(Progress...):在UI线程中执行,用于更新进度,例如更新进度条等。
  4. onPostExecute(Result):在UI线程中执行,用于执行异步任务完成后的操作,例如更新UI等。
  5. onCancelled():在UI线程中执行,用于在异步任务被取消时执行的操作。

应用

创建一个类继承AsyncTask

 private class DealDataColor extends AsyncTask {

        @Override
        protected Object doInBackground(Object[] objects) {
           //进行数据处理
            return null;
        }
    }

在主线程调用execute方法更新UI

 DealDataColor dealDataColor = new DealDataColor();
 dealDataColor.execute();

源码分析

这里使用的时候会发现,创建后的AsyncTask在execute后就不能再次使用了,那么为什么会这样设计呢?

看看源码:

//这是execute方法的实现
   public final AsyncTask<Params, Progress, Result> execute(Params... params) {
        return executeOnExecutor(sDefaultExecutor, params);
    }



//在execute里调用了executeOnExecutor
    public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
            Params... params) {
        if (mStatus != Status.PENDING) {
            switch (mStatus) {
                case RUNNING:
                    throw new IllegalStateException("Cannot execute task:"
                            + " the task is already running.");
                case FINISHED:
                    throw new IllegalStateException("Cannot execute task:"
                            + " the task has already been executed "
                            + "(a task can be executed only once)");
            }
        }

        mStatus = Status.RUNNING;

        onPreExecute();

        mWorker.mParams = params;
        exec.execute(mFuture);

        return this;
    }

可以看到这里先判断mStatus的值,这个值是一个枚举类里的值

    public enum Status {
        /**
         * Indicates that the task has not been executed yet.
         */
        PENDING,
        /**
         * Indicates that the task is running.
         */
        RUNNING,
        /**
         * Indicates that {@link AsyncTask#onPostExecute} has finished.
         */
        FINISHED,
    }


  private volatile Status mStatus = Status.PENDING;

这个值在初始化刚进来的时候已经被赋予了PENDING,判断值如果是不是PENDING直接就会抛出异常。

execute()executeOnExecutor() 方法的区别在于:

 

execute是固定了线程池执行。里面传入的sDefaultExecutor 是静态的

private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;

executeOnExecutor里面可以自定义线程池。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/427755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot+vue论坛管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的论坛管理系统。项目源码请联系风歌&#xff0c;文末附上联系信息 。 目前有各类成品java毕设&#xff0c;需要请看文末联系方式 。ja…

1.分布式电源接入对配电网影响分析

说明书 相关代码资源地址&#xff1a;风、光、负荷场景生成&#xff1b;风电出力各场景及概率&#xff1b;光伏出力各场景及概率&#xff1b;负荷各场景及概率&#xff1b;场景的削减&#xff1b;样本概率初始化&#xff1b;样本削减 基于多目标算法的冷热电联供型综合能源系…

Android 自定义View 之 圆环进度条

圆环进度条前言正文一、XML样式二、构造方法三、测量四、绘制① 绘制进度条背景② 绘制进度③ 绘制文字五、API方法六、使用七、源码前言 很多时候我们会使用进度条&#xff0c;而Android默认的进度条是长条的&#xff0c;从左至右。而在日常开发中&#xff0c;有时候UI为了让页…

亚马逊云科技为游戏全生命周期提供保障,降低游戏整体运营成本

开发一个“爆款”游戏总共需要几步&#xff1f;Marvel Snap可能会告诉你&#xff1a;第一步&#xff0c;专心致志把游戏做好、提高可玩性&#xff1b;第二步&#xff0c;把其他工作交给亚马逊云科技。 相关数据显示&#xff0c;自2022年10月18日正式发行以来&#xff0c;在不…

L2-044 大众情人分数 25分

人与人之间总有一点距离感。我们假定两个人之间的亲密程度跟他们之间的距离感成反比&#xff0c;并且距离感是单向的。例如小蓝对小红患了单相思&#xff0c;从小蓝的眼中看去&#xff0c;他和小红之间的距离为 1&#xff0c;只差一层窗户纸&#xff1b;但在小红的眼里&#xf…

【Hello Linux】信号量

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;简单介绍linux中信号量的概念 信号量信号量的概念信号量的使用信号量函数二元信号量模拟互斥功能基于环形队列的生产者消费者模型空间资…

CSS快速入门-选择器和优先级

文章目录CSS简介选择器CSS样式优先级CSS简介 CSS是一种用于样式化网页的语言&#xff0c;全称为“层叠样式表”&#xff08;Cascading Style Sheets&#xff09;。 它可以控制网页中元素的外观和布局&#xff0c;例如颜色、字体、大小、边距、对齐等&#xff0c;让网页变得更…

消费回暖:别总想着“报复”,而该想想怎么“修复”

01 是报复性消费吗&#xff1f;「报复性消费」一词最早是在2020年武汉疫情解封之后被大家熟知。之后的三年里&#xff0c;各路机构总是预测“等到常态化防疫结束之后&#xff0c;必将迎来真正的报复性消费”&#xff0c;事实果真如此吗&#xff1f;A面&#xff1a;涨自去年年底…

健康体检管理系统源码 PEIS源码 体检小结自动生成

健康体检管理系统源码 PEIS源码 数据对接 体检小结自动生成&#xff0c;商业源码&#xff0c;有演示&#xff0c;文档齐全。自主知识产权。 文末获取联系&#xff01; 一套专业的体检管理系统源码&#xff0c;该系统涵盖个人体检、团队体检、关爱体检等多种体检类型&#xf…

Learning Tone Curves for Local Image Enhancement

作者 LUXI ZHAO , ABDELRAHMAN ABDELHAMED , AND MICHAEL S. BROWN 论文比较清晰易懂。 就是图像分8∗8648*8648∗864个patch&#xff0c; 卷积网络为RGB三个通道预测 3∗643*643∗64 个 look up table, 就是每个patch 3个1D lut. 然后每个patch的中心直接用1D lut&#xf…

spring boot对敏感信息进行加解密

我们使用jasypt最新版本对敏感信息进行加解密。 1.在项目pom文件中加入如下依赖&#xff1a; <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version…

多维时序 | MATLAB实现CNN-GRU-Attention多变量时间序列预测

多维时序 | MATLAB实现CNN-GRU-Attention多变量时间序列预测 目录多维时序 | MATLAB实现CNN-GRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现CNN-GRU-Attention多变量时间序列预测&#xff0c;CNN-GRU-Attention结合注意…

Unity记录3.4-地图-柏林噪声生成 1D 地图及过渡地图

文章首发及后续更新&#xff1a;https://mwhls.top/4489.html&#xff0c;无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评&#xff0c;非常感谢&#xff01; 汇总&#xff1a;Unity 记录 摘要&#xff1a;柏林噪声生成…

超详细Redis入门教程——Redis概述

前言 本文小新为大家带来 超详细Redis入门教程——Redis概述 相关知识&#xff0c;具体内容包括Redis简介&#xff0c;Redis的用途&#xff0c;Redis的特性&#xff0c;Redis的IO模型&#xff08;包括&#xff1a;单线程模型&#xff0c;混合线程模型&#xff0c;多线程模型&am…

FPGA基于SFP光口实现1G千兆网UDP通信 1G/2.5G Ethernet PCS/PMA or SGMII替代网络PHY芯片 提供工程源码和技术支持

目录1、前言2、我这里已有的UDP方案3、详细设计方案4、vivado工程详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取1、前言 目前网上的fpga实现udp基本生态如下&#xff1a; 1&#xff1a;verilog编写的udp收发器&#xff0c;但不带ping功能&#xff0c;这样的代码…

【部署】openvino2023环境配置

1. 下载 官网下载&#xff0c;我的选项如下&#xff1a; 2.配置 2.1. 在visual studio的配置 下载vs2017或者是vs2022 新建一个c项目。选择控制台应用视图–》解决方案资源管理器 在源文件下创建main.cpp文件视图–》其他窗口–》属性管理器 右键Release 添加新项目属性表…

RocketMQ单机环境搭建测试

1.资源下载 官网&#xff1a;下载 | RocketMQ 这里选择使用编译后可以直接用的 下载后解压&#xff1a;略 2.更改配置 主要是更改 conf/broker.conf 的配置&#xff0c;记得添加上下面这几行&#xff0c;否则消息发送失败 autoCreateTopicEnabletrue # 支持自动创建topic…

GitHub重量上线,开源分布式架构原理设计笔记分享

在分布式系统中&#xff0c;一次业务处理可能需要多个应用来实现&#xff0c;比如用户发送一次下单请求&#xff0c;就涉及到订单系统创建订单&#xff0c;库存系统减库存&#xff0c;而对于一次下单&#xff0c;订单创建与减库存应该是要同时成功或者同时失效&#xff0c;但在…

大气颗粒物PMF源解析

详情点击链接&#xff1a;大气颗粒物PMF源解析 一&#xff0c;PMF源解析技术及其输入文件准备 1、大气污染源解析方法有哪些&#xff1f; 2、这些方法各自应用的条件以及它们的优缺点&#xff1f; 3、大气颗粒物的基础知识及各组分的主要来源 大气颗粒物的来源&#xff1a…

逆序对问题的两种求解思路(归并排序和树状数组)

前言&#xff1a;我们在求解逆序对问题时题目往往会给我们加大数据量&#xff0c;防止我们以暴力的方式通过该题&#xff0c;所以在遇到有关求解逆序对问题的时候&#xff0c;我们有必要知道一些具体的优化方法&#xff0c;对于逆序对我们&#xff0c;我们一般的会有两种标准求…