handler+message【消息机制】

article/2025/11/4 8:15:11

🍖🍖 作者 : 不良使
🍖🍖🍖🍖 潜力创作新星 华为云享专家
🍖🍖🍖🍖🍖 Python+Android
🍖🍖🍖🍖🍖🍖 博客记录学习的思路,项目和错误,寻找志同道合的朋友
🍖🍖🍖🍖🍖🍖🍖 如果觉得有帮助记得一键三连 ┗|`O′|┛ 嗷~~


在这里插入图片描述

🍎🍎引言

handler 主要是解决同一个页面的耗时操作。在看方法之前看一下Android中消息机制耗时操作一般不在主线程里面进行,因为可能会造成堵塞,加载慢,程序崩溃等。在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法。解决主线程无法完成耗时的操作有很多。

🥭🥭1、Handler(消息机制)
🥭🥭2、runOnUiThread(在子线程中new一个主线程)
🥭🥭3、Looper


这篇文章讲解Handler(消息机制)

🍎🍎handler实现

handler处理子线程无法进行耗时操作的方法就 等价于 将耗时操作通过任务的方式分配给别人,子线程中就执行了分配任务的操作(非耗时操作)。举个例子吧,大公司做一个大项目需要很长时间,但是分配给子公司就不需要干这个耗时的操作。只需要执行把任务分配给子公司,子公司做完后验收项目即可。等价于将独立完成大项目到最后只需要分配任务和审核项目操作。

🌹🌹🌹🌹🌹🌹🌹创建处理者和消息,发送数据。

Handler handler=new Handler();
Message message=new Message();
message.what=111;
message.obj=数据;//数据可以是基本类型、对象、列表、数组等
handler.sendMessage(message);


🍓🍓🍓🍓下面对handler中一些名词及相关进行解析。🍓🍓🍓🍓

Handler handler=new Handler();
Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。new Handler()相当于创建一个处理着。

Message message=new Message();
Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。new Message()相当于创建一个Message对象,存储数据为后面数据发送(任务分配)做准备

说到消息message,怎么能忘掉消息队列呢?
💕💕MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。looper下面会说

message.what=111;
这个相当于View.OnClickListener重写方法onClick(View v)的v.getId(),都是整型
在这里插入图片描述
下面会有使用这个,但是建议写死在一个类里面,便于项目管理。

message.obj=数据;//数据可以是基本类型、对象、列表、数组等
这句代码是正真的核心,相当于把赋值给这个message(消息对象),此时的数据类型可以是数据可以是基本类型、对象、列表、数组等

handler.sendMessage(message);
发送消息,将消息发送出去。



🌹🌹🌹🌹🌹🌹🌹重写handleMessage方法,接收数据,执行耗时操作。

@Overridepublic boolean handleMessage(@NonNull Message msg) {switch (msg.what){case 111:Toast.makeText(LoginMainActivity.this, "登陆失败" + mEtPassWord.getText().toString().trim(), Toast.LENGTH_SHORT).show();break;default:break;}return false;}

上面的handler发送消息可以根据 message.what=111; 发送不同的数据,handleMessage可以通过switch~case 区分出来。

handler有两种方法实现,原理都一样,一个直接new,一个调用接口。两种方式可根据项目自己选择。上面说的是第一种方法,但是原理是一样的,下面总结一下

🍓🍓第一种,接口implements

在这里插入图片描述


发送数据

Handler handler=new Handler();
Message message=new Message();
message.what=111;
message.obj=数据;//数据可以是基本类型、对象、列表、数组等
handler.sendMessage(message);

接收数据,执行耗时操作

@Overridepublic boolean handleMessage(@NonNull Message msg) {switch (msg.what){case 111:Toast.makeText(LoginMainActivity.this, "登陆失败" + mEtPassWord.getText().toString().trim(), Toast.LENGTH_SHORT).show();break;default:break;}return false;}


🍓🍓第二种,new个

子线程发送数据

private void updateWeather() {  new Thread(new Runnable(){  @Override  public void run() {  //耗时操作,完成之后发送消息给Handler,完成UI更新;  mHandler.sendEmptyMessage(0);  //传递数据Message msg =new Message();  msg.obj = "数据";//数据可以是基本类型、对象、列表、数组等  mHandler.sendMessage(msg);  }  }).start();  }  

主线程接收数据

Handler mHandler = new Handler() {  @Override  public void handleMessage(Message msg) {  super.handleMessage(msg);  switch (msg.what) {  case 0:  //拿到数据,执行耗时操作 String data = (String)msg.obj;  updateWeather();  textView.setText(data);  break;  case 1:......break;...default:  break;  }  }  };  

🥭🥭2、runOnUiThread(在子线程中new一个主线程)
🥭🥭3、Looper
见下一篇文章


嗯~~,看的不尽兴。*

在刷题之前先介绍一下牛客。Leetcode有的刷题牛客都有,除此之外牛客里面还有招聘(社招和校招)、一些上岸大厂的大佬的面试经验。 牛客是可以伴随一生的编程软件(完全免费),从学校到社会工作,时时刻刻你都可以用到感兴趣的可以去注册试试可以伴随一生的刷题app








觉得有用的可以给个三连,关注一波!!!带你了解更多的Android小知识


http://chatgpt.dhexx.cn/article/yddTGncw.shtml

相关文章

c++中MessageBox弹窗的用法大全

想必大家都知道&#xff0c;MessageBox函数是c语言中很常用且好玩的函数之一&#xff0c;那你知道它怎么用吗&#xff1f; 这是MessageBox函数的标准格式之一&#xff0c;本人喜欢用这种格式&#xff0c;注意函数的大小写&#xff01; MessageBox不在 #include<bits/stdc.h&…

message broker

MB概述 MB的全称是message broker&#xff0c;即“消息代理”。“消息”一词前几年比较火&#xff0c;消息中间件也卖的很火&#xff0c;当时似乎J2EE的产品都要跟“消息”、“中间件”扯上点关系&#xff0c;以彰显潮流。我觉得初学者只需记住“消息”的异步性即可&#xff0c…

MP3音频文件格式(MPEG-1 audio layer 3)

MP3音频文件格式 【百度百科】mp3 &#xff08;一种音频编码方式&#xff09; 【维基百科】MP3&#xff08;本文重定向自 MPEG-1 Audio Layer 3&#xff09; MP3(MPEG-1 audio layer 3) MPEG-1音频分三层&#xff0c;分别为 MPEG-1 Layer1&#xff0c;MPEG-1 Layer2 以及 MPE…

怎么把wav文件改成mp3?

怎么把wav文件改成mp3&#xff1f;有过摄像摄影经历的小伙伴都应该认识wav&#xff0c;wav就是他们作品的保存格式。因为wav格式的文件体积特别大&#xff0c;在储存的时候会占用我们大量的内存&#xff0c;而且为了播放方便&#xff0c;我们通常要把wav文件改成mp3格式的&…

音频文件如何转成mp3格式

当提到音频文件格式时&#xff0c;大家往往会想到最为流行和广泛使用的mp3格式。mp3是一种广受欢迎的音频格式&#xff0c;因为各种音频格式自身特点的原因&#xff0c;所以将其他格式的音频文件转换成mp3是非常普遍的需求。就比如在我们日常生活中&#xff0c;下载到的各种格式…

如何转换音频格式为mp3?

一提到音乐&#xff0c;大家先想到的应该就是MP3了&#xff0c;既然MP3作为常用的&#xff0c;被大家所熟知的一种音频格式&#xff0c;那它必定有其他格式无可比拟的优点。其实mp3从功能上来讲它具有更强的携带性和传输性&#xff0c;利于保存和分享&#xff1b;其次MP3本身的…

电脑音频转换mp3格式怎么弄,教你音频怎么转换mp3格式

mp3格式是目前几乎全兼容的格式了&#xff0c;在我们参加一些会议或讲座时&#xff0c;需要录制一些重要的信息&#xff0c;结束后再进行复盘或分享。然而&#xff0c;不同的录制工具录制的音频格式也不同&#xff0c;这时使用软件将音频统一成mp3格式的话&#xff0c;就会方便…

免费在线MP3转换器:将音乐文件转换为MP3格式

在今天的数字时代&#xff0c;音乐成为了人们生活中不可或缺的一部分。然而&#xff0c;由于音乐文件格式的不同&#xff0c;我们有时可能无法在不同的设备上播放我们最喜爱的歌曲。MP3格式作为最常用的音乐文件格式之一&#xff0c;通常可以被几乎所有的设备支持&#xff0c;因…

mp3格式怎么弄?分享三个音频文件格式转换的方法

不知道小伙伴们有没有遇到过这样的情况&#xff0c;在网上下载一首歌下来&#xff0c;正想打开&#xff0c;结果却发现我们的播放器无法播放。你们知道这是为什么嘛&#xff0c;其实我们的音频文件是有很多不同的格式&#xff0c;其中就有些比较少见的格式&#xff0c;我们的音…

如何从MP4视频文件中抽取MP3音频?

简 介&#xff1a; 为了能够处理视频中的音频&#xff0c;测试了两种提取视频中的音频方法。一种是利用格式工程软件另外一种利用ffmpeg软件。 关键词&#xff1a; 视频文件&#xff0c;音频文件&#xff0c;mp4&#xff0c;mp3 #mermaid-svg-sPs0isryqtLTjZyg {font-family:&q…

如何将音频文件转换为MP3格式?

音频文件有很多种格式&#xff0c;如 WAV、FLAC、AAC 等&#xff0c;其中 MP3 是最为常见的一种格式&#xff0c;因为它具有压缩比高、音质损失少、兼容性强等优点&#xff0c;适合在各种设备上播放。如果你想将一个音频文件转换为 MP3 格式&#xff0c;可以采用以下几种方法&a…

Next() Nextline() hasNext()区别

next类和hasNext方法遇到缓冲区没数据时&#xff0c;会阻塞&#xff0c;等待输入后next类会读取&#xff0c;hasNext会返回true 1&#xff09;nextLine nextLine&#xff08;&#xff09;方法返回的是"\n"之前的所有字符&#xff0c;它是可以得到带空格的字符串的。 …

BNext

又搬来了大神器啊 来自德国HassoPlattner计算机系统工程研究院的NianhuiGuo和HaojinYang等研究者提出了BNext模型&#xff0c;成为第一个在ImageNet数据集上top1分类准确率突破80%的BNN。 两年前&#xff0c;依靠早期 BNN 工作 XNOR-Net 起家的 XNOR.AI 被苹果公司收购&#…

Next.js学习笔记

这是一个用于生产环境的React 框架&#xff0c;Next.js 为您提供生产环境所需的所有功能以及最佳的开发体验&#xff1a;包括静态及服务器端融合渲染、 支持 TypeScript、智能化打包、 路由预取等功能 无需任何配置。 create-next-app 使用 create-next-app创建新的 Next.js …

搭建vue3项目时出现Cannot read property ‘nextSibling‘ of null报错

记录自己学习中&#xff0c;出现的错误 在搭建vue3项目&#xff0c;配置router&#xff0c;vuex,element-ui后&#xff0c;运行项目页面白屏&#xff0c;控制台出现了Cannot read property nextSibling of null的错误 查看main.ts 文件&#xff0c;此时的写法是&#xff1a; …

hasNext、hasNextLine、next、nextLine保姆级详解

目录 前言 hasNext和hasNextLine的区别 hasNext 和 next组合 hasNext 和 NextLine组合 hasNextLine 和 next组合 hasNextLine 和 nextLine组合 验证hasNext、hasNextLine对输入代码的存储寿命 总结 前言 在查阅了大量网上相关资料都没有一个完整的解释&#xff0c;并且我…

细节!关于Java中的next与nextLine

目录 一、发现问题 二、解决问题 &#xff08;1&#xff09;输入连续字符串 &#xff08;2&#xff09;输入不连续字符&#xff08;含有空格等&#xff09; &#xff08;3&#xff09;nextLine()方法在前&#xff0c;next()方法在后 &#xff08;4&#xff09;next()方法在…

NextJs 学习笔记

NextJs 学习笔记 简述 之前使用过 Nuxt3 基于前端框架 Vue3 来开发网站&#xff0c;因为 Nuxt3 很多地方借鉴了基于 React 的 SSR 框架 Next&#xff0c;因此最近抽时间开始学习一下 Next 这个框架。 创建项目 npx create-next-applatest # or yarn create next-app # or p…

next和nextLine的使用

&#xff08;因为最近在学算法&#xff0c;我只讲实际应用方面的区别&#xff0c;不讲理论&#xff09; 一、hasNext()与hasNextLine()的区别&#xff1f; 1、hasNext()方法会判断接下来是否有非空字符.如果有,则返回true,否则返回false 2、hasNextLine() 方法会根据行匹配模式…

nextSibling和nextElementSilbing使用以及解决兼容性问题

nextSibling和nextElementSilbing使用以及解决兼容性问题 1、今天学习了 获取兄弟节点 的方法 – nextSibling&#xff08;获取下一个兄弟节点&#xff09;、previousSibling(获取上一个兄弟节点) Node.nextSibling 是一个只读属性&#xff0c;返回其父节点的 childNodes 列表…