新手理解:Android 中 Handler 和 Thread.sleep 的区别及应用场景

新手理解:Android 中 Handler 和 Thread.sleep 的区别及应用场景

    • Handler 是啥?
      • Handler 的几个核心功能:
    • Thread.sleep 是啥?
      • Thread.sleep 的核心特点:
    • 两者的区别
    • 它们的应用场景
      • 1. Handler 的应用场景
      • 2. Thread.sleep 的应用场景
      • 常见应用场景:
      • 例子:后台线程每隔 1 秒打印一次时间
    • 总结
      • 工具与适用场景对比
      • 选择工具的建议

刚接触 Android 开发时,我对 HandlerThread.sleep 这两个东西有点迷惑。它们都和时间操作有关,但实际上,它们是完全不同的东西,用在不同的场景中。下面我用自己的话来讲一下我的理解,分享给刚入门的朋友们。


Handler 是啥?

Handler 是 Android 提供的用于线程间通信的工具,主要作用是将任务切换到主线程(或其他特定线程)去执行,尤其是当需要更新 UI 的时候。
Android 的 UI 操作只能在主线程(也叫 UI 线程)中完成,而 Handler 就是帮助我们把后台线程的任务发送到主线程的桥梁。

Handler 的几个核心功能:

  1. 发送消息:用 sendMessage()post() 方法把任务交给指定的线程执行。
  2. 处理消息:通过重写 HandlerhandleMessage() 方法,处理传过来的任务。
  3. 延时任务:用 postDelayed()sendMessageDelayed() 方法实现任务的延迟执行。

简单理解:Handler 就像一个快递员,负责把任务(消息)从一个线程送到另一个线程,并且还能按约定时间送达。


Thread.sleep 是啥?

Thread.sleep 是 Java 提供的线程休眠方法,它会让当前线程暂停一段时间,然后再继续执行。注意,它是直接暂停线程,而不是让线程切换到其他地方去运行。

Thread.sleep 的核心特点:

  1. 暂停当前线程:在调用线程上暂停指定时间,其他线程不会受到影响。
  2. 简单暴力:它不会像 Handler 那样发送任务到其他线程,只是单纯让线程“休息”。

简单理解:Thread.sleep 就像给线程设了个闹钟,等闹钟响了再继续工作。


两者的区别

特性HandlerThread.sleep
作用线程间通信、任务调度(尤其是更新 UI)暂停当前线程
线程切换可把任务切换到指定线程无法切换线程,只在当前线程暂停
主要用法处理消息、延时执行任务暂时停止线程的执行,比如模拟延迟
对主线程的影响不会阻塞主线程,可安全更新 UI如果在主线程调用,会阻塞主线程,导致 ANR(无响应)
复杂度功能更丰富,能处理多线程间的任务分发用法简单,但功能有限

它们的应用场景

1. Handler 的应用场景

Handler 非常适合处理需要跨线程的任务,尤其是后台线程完成任务后需要更新 UI 的情况。

  • 延迟任务:比如在 5 秒后弹出一条 Toast。
  • 更新 UI:比如从后台线程加载数据后,更新界面上的列表。
  • 循环任务:比如每隔 1 秒刷新一次屏幕上的倒计时。

例子:延迟 3 秒后更新 TextView

Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        textView.setText("延迟更新完成!");
    }
}, 3000);

2. Thread.sleep 的应用场景

虽然 Thread.sleep 看似简单,但它在某些场景下非常实用,尤其是在需要对线程行为进行控制时。

常见应用场景:

  • 模拟延迟
    比如模拟网络请求的延迟。
  • 间隔执行任务
    比如在后台线程每隔一段时间执行一次任务。
  • 节流机制
    限制后台任务的执行频率,避免资源过度消耗。
  • 线程同步测试
    调试和测试线程的同步问题,比如模拟线程间竞争资源。
  • 延迟启动服务
    比如模拟延迟初始化一个服务。
  • 后台倒计时
    在不涉及 UI 更新的简单倒计时场景。

例子:后台线程每隔 1 秒打印一次时间

new Thread(() -> {
    try {
        while (true) {
            System.out.println("当前时间:" + System.currentTimeMillis());
            Thread.sleep(1000); // 每隔 1 秒执行一次
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}).start();

总结

工具与适用场景对比

工具适用场景
Handler跨线程通信、主线程 UI 更新、延时任务、定时任务
Thread.sleep模拟延迟、线程休眠、间隔任务、简单倒计时、调试线程同步问题
  • Handler:功能强大,适合多线程通信和复杂任务调度,尤其是在需要更新主线程 UI 的时候。
  • Thread.sleep:简单易用,适合线程控制和延迟操作,但在主线程中需要避免使用,以免导致阻塞。

选择工具的建议

作为刚接触 Android 的新手,我总结了以下几点建议:

  1. 需要跨线程通信或更新 UI 时,优先使用 Handler
  2. 在后台线程实现简单的延迟或循环任务 时,可以使用 Thread.sleep
  3. 在主线程中尽量避免使用 Thread.sleep,否则会导致 ANR(应用无响应)。

希望我的分享能帮助大家更好地理解这两种工具的区别,并根据实际需求选择合适的实现方式!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio Code修改terminal字体

个人博客地址:Visual Studio Code修改terminal字体 | 一张假钞的真实世界 默认打开中断后字体显示如下: 打开设置,搜索配置项terminal.integrated.fontFamily,修改配置为monospace。修改后效果如下:

MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log

文章目录 一、前言1.1 MySQL体系结构1.2 MySQL日志分类1.3 其他几种日志1.3.1 查询日志1.3.2 慢查询日志1.3.3 错误日志 二、bin log 二进制日志2.1 bin log简介2.2 binlog日志格式2.3 日志删除2.4 写入/刷盘机制 三、undo log 回滚日志3.1 undo log简介3.2 隐藏字段 —— 事务…

electron打包客户端在rk3588上支持h265硬解

目录 前言 chromium是如何支持h265硬解 electron/chromium第一次编译 electron/chromium第二次编译 前言 我们的客户端程序是用electron打包的前端程序,其在rk3588主机上的linux环境运行。之前使用客户端查看h264编码的视频直播是没有问题的,但视频源…

关于CAN(FD)转以太网详细介绍

一、功能描述 CANFD 完全向下兼容 CAN ,以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…

DRG_DIP 2.0时代医院程序结构转型与数据结构优化研究

一、引言 1.1 DRG_DIP 2.0 改革背景与意义 医保支付方式改革在医疗保障制度改革中占据着极为关键的地位,是推动医疗领域变革的核心力量。它犹如一把精准的手术刀,对医疗资源的合理分配、医疗服务质量的稳步提升以及医疗费用的有效控制起着决定性作用。在这一改革进程中,DR…

Arcgis国产化替代:Bigemap Pro正式发布

在数字化时代,数据如同新时代的石油,蕴含着巨大的价值。从商业决策到科研探索,从城市规划到环境监测,海量数据的高效处理、精准分析与直观可视化,已成为各行业突破发展瓶颈、实现转型升级的关键所在。历经十年精心打磨…

洛谷 B2031:计算三角形面积 ← 叉积

【题目来源】 https://www.luogu.com.cn/problem/B2031 【题目描述】 平面上有一个三角形,它的三个顶点坐标分别为 (x1, y1),(x2, y2),(x3, y3),那么请问这个三角形的面积是多少。 【输入格式】 输入仅一行,包括 6 个…

从 Spark 到 StarRocks:实现58同城湖仓一体架构的高效转型

作者:王世发,吴艳兴等,58同城数据架构部 导读: 本文介绍了58同城在其数据探查平台中引入StarRocks的实践,旨在提升实时查询性能。在面对传统Spark和Hive架构的性能瓶颈时,58同城选择StarRocks作为加速引擎&…

Kafak 单例生产者实现-C#操作

前面写了一篇入门操作的文章,因为工作需要,简单修改了下如何实现单例生产者。 Kafka入门-C#操作_c# kafka-CSDN博客文章浏览阅读1.6k次,点赞20次,收藏9次。2).报错:“kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state…

【GoLang】利用validator包实现服务端参数校验时自定义错误信息

在C/S架构下,服务端在校验请求参数时,若出现参数错误,要响应给客户端一个错误消息,通常我们会统一响应“参数错误”。 但是,如果只是一味的提示参数错误,我并不知道具体是哪个参数错了呀!能不能…

机器学习 vs 深度学习

目录 一、机器学习 1、实现原理 2、实施方法 二、深度学习 1、与机器学习的联系与区别 2、神经网络的历史发展 3、神经网络的基本概念 一、机器学习 1、实现原理 训练(归纳)和预测(演绎) 归纳: 从具体案例中抽象一般规律…

Unity git版本管理

创建仓库的时候添加了Unity的.gitignore模版,在这个时候就能自动过滤不需要的文件 打开git bash之后,步骤git版本管理-CSDN博客 如果报错,尝试重新进git 第一次传会耗时较长,之后的更新就很快了

【JWT】jwt实现HS、RS、ES、ED签名与验签

JWT 实现 HS、RS、ES 和 ED 签名与验签 签名方式算法密钥类型签名要点验签要点HSHMAC-SHA256对称密钥- 使用 crypto/hmac 和对称密钥生成 HMAC 签名- 将 header.payload 作为数据输入- 使用同一密钥重新计算 HMAC 签名- 比较计算结果与接收到的签名是否一致RSRSA-SHA256公钥 …

【Bug 记录】el-sub-menu 第一次进入默认不高亮

项目场景: 项目场景:el-sub-menu 第一次进入默认不高亮 问题描述 例如:sub-menu 的 index 后端默认传过来是 number,我们需要手动转为 string,否则会有警告,而且第一次进入 sub-menu 默认不高亮。 解决方…

LLM幻觉(Hallucination)缓解技术综述与展望

LLMs 中的幻觉问题(LLM 幻觉:现象剖析、影响与应对策略)对其可靠性与实用性构成了严重威胁。幻觉现象表现为模型生成的内容与事实严重不符,在医疗、金融、法律等对准确性要求极高的关键领域,可能引发误导性后果&#x…

挖掘机的市场现状和发展前景:全球增长潜力,重塑基础设施建设新篇章

引言:工程机械的心脏,挖掘机的崛起之路 在现代化建设的浪潮中,挖掘机作为工程机械领域的核心设备,正以其强大的作业能力和广泛的应用场景,成为推动全球基础设施建设不可或缺的力量。从高速公路到大型矿场,…

算法每日双题精讲 —— 二分查找(山脉数组的峰顶索引,寻找峰值)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧💪 在算法的…

Flutter_学习记录_基本组件的使用记录

1.TextWidge的常用属性 1.1TextAlign: 文本对齐属性 常用的样式有: TextAlign.center 居中TextAlign.left 左对齐TextAlign.right 有对齐 使用案例: body: Center(child: Text(开启 TextWidget 的旅程吧,珠珠, 开启 TextWidget 的旅程吧&a…

二叉树的存储(下)c++

链式存储 我们可以创建两个数组L[N]、r[N]&#xff0c;分别存储i 号结点的左右孩子的编号&#xff0c;这样就可以通过数组下标实现链式访问。 本质上还是孩子表示法&#xff0c;存储的是左右孩子的信息 #include <iostream>using namespace std;const int N 1e6 10; …

基于Docker的Kafka分布式集群

目录 1. 说明 2. 服务器规划 3. docker-compose文件 kafka{i}.yaml kafka-ui.yaml 4. kafka-ui配置集群监控 5. 参数表 6. 测试脚本 生产者-异步生产: AsyncKafkaProducer1.py 消费者-异步消费: AsyncKafkaConsumer1.py 7. 参考 1. 说明 创建一个本地开发环境所需的k…