Handler及相关的理论知识

news2024/9/27 15:32:02

前言

学安卓的都接触过Handler,许多老java项目中也有很多使用Handler进行网络通讯,或许现在我们都用kotlin,用协程,但咱也不能就把Handler忘了,本篇文章特此巩固Handler相关知识

是什么

Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。(也就是异步操作) 这种机制通常用来处理相对耗时比较长的操作(例如网络操作等)。

在这里插入图片描述

作用

Handler类的主要作用有两个。

  1. 在新启动的线程中发送消息。
  2. 在主线程中获取、处理消息。

方法介绍

上面的说法看上去很简单,似乎只要分成两步即可:在新启动的线程中发送消息:然后在主线程中获取并处理消息。但这个过程涉及两个问题:新启动的线程何时发送消息呢?主线程何时去获取并处理消息呢?这个时机显然不好控制。
为了让主线程能“适时”地处理新启动的线程所发送的消息,显然只能通过回调的方式来实现–开发者只要重写Handler类中处理消息的方法,当新启动的线程发送消息时,消息会发送到与之关联的MessageQueue,而Handler会不断地从MessageQueue中获取并处理消息-这将导致Handler类中处理消息的方法被回调。

Handler类包含如下方法用于发送、处理消息。

  • handleMessage(msgMessage):处理消息的方法。该方法通常用于被重写。 hasMessages(what:Int):检查消息队列中是否包含what属性为指定值的消息。
  • hasMessages(what:Intobject:Any):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息。
  • 多个重载的Message obtainMessage():获取消息。 sendEmptyMessage(whatLong):发送空消息。
  • sendEmptyMessageDelayed(whatLongdelayMillisLong):指定多少毫秒之后发送空消息。
  • sendMessage(msg:Message):立即发送消息。
  • sendMessageDelayed(msg:MessagedelayMillisLong):指定多少毫秒之后发送消息。借助于上面这些方法,程序可以方便地利用Handler来进行消息传递。

Handler、Loop MessageQueue的工作原理

为了更好地理解Handler的工作原理,下面先介绍一下与Handler一起工作的几个组件。

  • Message:Handler接收和处理的消息对象。

  • Looper:简单来说: 每个线程只能拥有一个Looper。它的loop方法负责读取MessageQueue中的
    消息,读到信息之后就把消息交给发送该消息的Handler进行处理。复杂点来说:Looper用于为线程运行消息循环。默认情况下,线程没有与其关联的消息循环;要创建一个,请在要运行循环的线程中调用prepare,然后循环让它处理消息,直到循环停止。

  • MessageQueue:消息队列,它采用先进先出的方式来管理Message程序创建Looper对象时,会在它的构造器中创建MessageOueue对象。

在线程中使用Handler(Looper使用示例)

步骤如下:

  1. 调用Looper的prepare()方法为当前线程创建Looper对象,创建Looper对象时,它的
    构造器会创建与之配套的MessageQueue。
  2. 有了Looper之后,创建Handler子类的实例,重写handleMessage()方法,该方法负责处理来自于其他线程的消息。
  3. 调用Looper的loop)方法启动Looper。
Created with Raphaël 2.3.0 Thread Looper.prepare() Handler Looper.loop()

代码示例:

   class LooperThread extends Thread {
       public Handler mHandler;
 
       public void run() {
           Looper.prepare();
 
           mHandler = new Handler(Looper.myLooper()) {
               public void handleMessage(Message msg) {
                   // 在此处处理传入消息
           };
 
           Looper.loop();
       }
   }

参考

百度百科
疯狂Android讲义(kotlin版)

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

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

相关文章

Anaconda, Python, Jupyter和PyCharm介绍

目录 1 Anaconda, Python, Jupyter和PyCharm介绍 2 macOS通过Anaconda安装Python, Jupyter和PyCharm 3 使用终端创建虚拟环境并安装PyTorch 4 安装PyCharm并导入Anaconda虚拟环境 5 Windows操作系统下Anaconda与PyCharm安装 6 通过 Anaconda Navigator 创建 TensorFlow 虚…

Php“牵手”淘宝商品SKU信息数据采集方法,淘宝API接口申请指南

淘宝天猫商品属性sku信息接口 API 是开放平台提供的一种 API 接口,它可以帮助开发者获取商品的详细信息,包括商品的标题、描述、图片,销量,sku信息等信息。在电商平台的开发中,商品属性接口API是非常常用的 API&#x…

【HCIP】03.VLAN高级技术

Eth-trunk 链路聚合,定义出一个逻辑聚合口,把物理接口和逻辑接口关联,此时在STP中,会把多个物理接口看成一个逻辑接口,此时不会出现环路。 接口负载分担(逐包|逐流) 基于IP的散列算法能保证包…

Fast DDS (2)

1、结构: Fast DDS的架构如下图所示,可以看到以下不同环境的层模型: 应用层:利用Fast DDS API 在分布式系统中实现通信的用户应用程序。Fast DDS层:DDS 通信中间件的稳健实现。它允许部署一个或多个 DDS 域&#xff…

css 实现电梯导航

实现原理&#xff1a;利用css实现电梯导航很简单&#xff0c;基本原理就是通过a标签绑定跳转目标的id来实现的 html代码&#xff1a; <div class"body"><div class"top" id"top"></div><div class"con1" id"…

[Docker] Portainer + nginx + AList 打造Docker操作三板斧

Portainer : Docker容器图形化管理系统nginx: 反向代理利器AList: 文件管理系统 1. 安装 ##### portainer ##### # 拉取镜像 portainer 注: ce 社区版 ee 企业版 原项目(portainer/portainer)已弃用 docker pull portainer/portainer-ce # 运行容器 docker run -d --name por…

如何编写系统要求规范(SRS)文档

想象一下&#xff0c;你负责设计一座17层的大楼&#xff0c;但是蓝图丢失了。在没有这个关键文件的情况下&#xff0c;整个项目可能会因严重错误而处于风险之中。软件项目也有类似的情况&#xff0c;如果没有蓝图&#xff0c;你可能会生开发出缺乏必要软件功能并且与客户需求不…

【Apollo】阿波罗自动驾驶技术:引领汽车行业革新

前言 Apollo (阿波罗)是一个开放的、完整的、安全的平台&#xff0c;将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、…

Python爬取Google高清遥感瓦片地图

Python爬取Google高清遥感瓦片地图 这是一个能直接从Google地图服务下载瓦片地图的程序&#xff0c;非常稳定&#xff0c;只需要设置需要下载的左上角和右下角的经纬度坐标即可下载。当然总所周知的原因&#xff0c;下载google地图需要先打开梯子。 下面放上一个下载的高清遥感…

【数据结构】回溯算法公式化解题 leetcode经典题目带刷:全排列、组合、子集

目录 回溯算法一、什么是回溯算法1、基本思想&#xff1a;2、一般步骤&#xff1a; 二、题目带练1、全排列2、组合3、子集 三、公式总结 回溯算法 一、什么是回溯算法 回溯算法&#xff08;Backtracking Algorithm&#xff09;是一种解决组合问题、排列问题、选择问题等一类问…

Python“牵手”淘宝商品详情数据采集方法,淘宝API申请步骤说明

淘宝平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范。 淘宝API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问淘宝平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现淘宝平台的数据开…

Android开发基础知识总结(一)初识安卓Android Studio

一.基础理论知识 1.Linux相当于是地基。 MIUI&#xff0c;EMUI等操作系统&#xff0c;是基于安卓的改版——且裁掉了一部分Google的服务。 &#xff08;鸿蒙虽然是改版&#xff0c;但和安卓的架构基本上一致&#xff09; 2.Kotlin和Java都是JVM语言&#xff0c;必须先复习好…

Python数据分析实战-给定JSON格式的数据提取所需字段并转换为DataFrame(附源码和实现效果)

实现功能 给定JSON格式的数据提取所需字段并转换为DataFrame 实现代码 import pandas as pd import json# 假设给定的JSON数据已经存储在data变量中 data [{"title": "Data Source Adapter for Excel Sheets","project_code_url": "htt…

Mac下Jmeter安装及基本使用

本篇文章只是简单的介绍下Jmeter的下载安装和最基本使用 1、初识Jmeter 前一段时间客户端app自测的过程中&#xff0c;有偶现请求某个接口返回数据为空的问题&#xff0c;领导让我循环100次请求这个接口&#xff0c;看看有没有结果为空的问题。听同事说有Jmeter的专业测试工具…

Java数据结构学习和源码阅读(线性数据结构)

线性数据结构 链表 LinkList 链表的数据结构 一组由节点组成的数据结构&#xff0c;每个元素指向下一个元素&#xff0c;是线性序列。 最简单的链表结构&#xff1a; 数据指针&#xff08;存放执行下一个节点的指针&#xff09; 不适合的场景&#xff1a; 需要循环遍历将…

【C++】 使用红黑树模拟实现STL中的map与set

文章目录 前言1. 对之前实现的红黑树进行一些补充和完善1.1 析构1.2 查找 2. STL源码中map和set的实现3. 改造红黑树封装map和set3.1 红黑树结构修改3.2 map、set的结构定义3.3 insert的封装3.4 insert测试3.5 发现问题并解决3.6 红黑树迭代器实现3.7 封装set和map的迭代器并测…

uniapp scroll-view横向滚动无效,scroll-view子元素flex布局不生效

要素排查&#xff1a; 1.scroll-x属性需要开启&#xff0c;官方类型是Boolean&#xff0c;实际字符串也行。 2scroll-view标签需要给予一个固定宽度&#xff0c;可以是百分百也可以是固定宽度或者100vw。 3.子元素需要设置display: inline-block&#xff08;行内块元素&#x…

国标GB28181视频平台EasyGBS通过对应密钥上传到其他平台展示的详细步骤来啦!

国标GB28181协议视频平台EasyGBS是基于国标GB28181协议的视频云服务平台&#xff0c;支持多路设备同时接入&#xff0c;并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可提供视频监控直播、云端录像、云存储、检索回放、智能告警、语音对讲、平台级…

项目管理实战笔记:硬技能(下)

需求变更&#xff1a; pmp里面涉及需求变更的很多&#xff0c;尤其是CCB 对于CCB的需求变更&#xff0c;可能需要以下步骤&#xff1a; 1. 确定变更的原因和必要性&#xff1a;需要了解变更是因为业务需求的变化、技术方案的变更还是其他原因&#xff0c;以及变更是否是必要的…

内行才知道的新闻稿发布技巧,媒介盒子为你揭秘

不知道最近其他小伙伴有没有遇上以上说的一些情况&#xff0c;必须借助新闻稿发布达到营销推广的目的。 可是对于新闻稿发布这一块却不知道应该怎么办&#xff0c;尤其是新手上任&#xff0c;对于如何发布新闻稿是一头雾水。 新闻稿的发布是企业在公关传播中重要的一环&#…