Handler详解二

Android Handler分析 (二) MessageQueue详解 在上一篇博客《Android中的Handler机制分析(一) Handler和Message分析》中我们说到了Android中Handler机制的两个重要类Message和Handler,在这篇博客中,我们继续来看一下另外的一个重要类,MessageQueue(消息队列)类。直接接着上一篇博客来。MessageQueue源码分析:1.MessageQueue中的一些成员变量private fina... 阅读详情

前言: 很早以前,学习android的时候就接触过Handler ,知道Handler是一个用于线程间通信的类,最常用于做下载条,最近,看了Pro android 3 这本书,里面描述的Handler 说得非常的细致,与此,写下Handler的学习笔记

Android 运行的进程

  为了,更好的了解Handler的机制,我们应该首先,将Android系统整个运行进程都要烂熟于心,下面是android 进程运行图:

androidProcess 


从图中我们可以看到,当我们从外部调用组件的时候,Service 和 ContentProvider 是从线程池那里获取线程,而Activity 和BroadcastReceiver是直接在主线程运行,为了,追踪线程,我们可以用debug 方法,或者使用一个工具类,这里,我们创建一个用于监视线程的工具类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
  * @author Tom_achai
  * @ date 2011-11-20
  *
  */
public class Utils {
     public static long getThreadId(){
         Thread t = Thread.currentThread();
         return t.getId();
     }
     
     /**
      * 获取单独线程信息
      * @ return
      */
     public static String getThreadSignature(){
         Thread t = Thread.currentThread();
         long l = t.getId();
         String name = t.getName();
         long p = t.getPriority();
         String gname = t.getThreadGroup().getName();
         return ( "(Thread):" +name+ ":(id)" + l + "(:priority)" + p + ":(group)" + gname );
     }
     
     
     
     /**
      *获取当前线程 信息
      */
     public static void logThreadSignature(){
         Log.d( "ThreadUtils" , getThreadSignature());
     }
     
     public static void logThreadSignature(String name ){
         Log.d( "ThreadUtils" , name + ":" +getThreadSignature());
     }
     
     public static void sleepForInSecs(int secs){
         try{
             Thread. sleep (secs * 1000);
         }catch (Exception e) {
             // TODO: handle exception
             e.printStackTrace();
         }
     }
     
     /**
      * 讲String放进Bundle 中
      * @param message
      * @ return
      */
     public static Bundle getStringAsBundle(String message){
         Bundle b = new Bundle();
         b.putString( "message" , message);
         return b;
     }
     
     /**
      *
      * 获取Bundle的String
      * @param b
      * @ return
      */
     public static String getStringFromABundle(Bundle b){
         return b.getString( "message" );
     }
}

有了这样一个类就可以方便我们观察线程的运行

好了,现在准备好以后就进入正题Handler

Handlers

为什么要使用Handlers?

    因为,我们当我们的主线程队列,如果处理一个消息超过5秒,android 就会抛出一个 ANP(无响应)的消息,所以,我们需要把一些要处理比较长的消息,放在一个单独线程里面处理,把处理以后的结果,返回给主线程运行,就需要用的Handler来进行线程建的通信,关系如下图;

     mainthread

下面是Handler,Message,Message Queue 之间的关系图

Handlers

这个图有4个地方关系到handlers

1, 主线程(Main thread)

2, 主线程队列(Main thread queue)

3,Hanlder

4,Message

   上面的四个地方,主线程,和主线程的队列我们无需处理,所以,我们主要是处理Handler 和 Message 之间的关系.

   我们每发出一个Message,Message就会落在主线程的队列当中,然后,Handler就可以调用Message绑定的数据,对主线程的组件进行操作.

Message

作为handler接受的对象,我们有必要知道Message这个数据类型是个怎样的数据类型

从官方文档中我们可以知道message 关于数据的字段

   
public int what  
public int arg1  
public int arg2  
public Object obj  

从上面的表格可以看出,message 提供了一个对象来存储对象,而且,还提供了三个int字段用来存储少量int类型

当然,除了以上三个Message 自有的字段外,我们还可以通过setData(Bundle b),来存储一个Bundle对象,来存储更丰富的数据类型,例如,图片等等.

在初始化我们的message的时候就可以为我们的Message默认字段赋值,注意赋值顺序!!!

?
1
2
3
4
5
6
7
8
9
Message msg = obtainMessage();
// 设置我们what 字段的初值,注意顺序!!!
Message msg = mHandler.obtainMessage(int what);
 
// 下面同理
Message msg = mHandler.obtainMessage(int what,Object object);
Message msg = mHandler.obtainMessage(int what,int arg1,int arg2);
Message msg = mHandler.obtainMessage(int what,int arg1,int arg2, Object obj
);

 

 


作者:游戏阿柴 
出处:http://www.cnblogs.com/youxilua 
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。 




Android——Handler详解 1. 简介 Handler是一套 Android 消息传递机制 可以说只要有异步线程与主线程通信的地方就一定会有 Handler。 在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理 使用Handler消息传递机制主要是为了多个线程并发更新UI的同时,保证线程安全 2. 相关概念解释 Handler、Message、Message Queue、Looper Android消息机制: 以Handler的sendMes 阅读详情

相关推荐

Handler消息机制详解

转载请注明链接:http://blog.youkuaiyun.com/feather_wch/article/details/79263855 介绍Handler、Looper、MessageQueue、ThreadLocal和主线程ActivityThread等内容 Android的消息机制 版本:2018/2/6-1 Android的消息机制 消息机制概述 ThreadLocal 消息...

feather(猎羽) 2322

Handler传值方式及Message和obtainMessage的区别

bundle传值,耗时,效率低 message方法传值,效率高,但只能传整型int和对象object(msg.arg1,msg.arg2,msg.obj) Handler传值方式之Handler public class MainActivity extends Activity { private TextView tv; private Bundle bundle; priva

qq1170762202的博客 3204

别再只看pLDDT了!AlphaFold预测结果解读保姆级指南:pLDDT、PAE、pTM、ipTM到底怎么看?

本文详细解析了AlphaFold预测结果中的关键指标pLDDT、PAE、pTM和ipTM,帮助用户从单一依赖pLDDT进阶到全面理解蛋白质结构预测。通过实际案例和技巧,指导如何正确解读这些指标,避免常见错误,并提供了从预测到发表的实用建议。

weixin_29100399的博客 354

Handler之Message分析

创建Message的3中方式: 第一种方式: //这种是常见的创建对象的方式,每次需要发送消息的时候都需要创建一个Message 对象,每次都要到堆内存中开辟新的存储空间,使用之后jvm再次进行回收处理 Message message = new Message(); 第二种方式: Message message = mHandler.obtainMessage(); 先简单看下源码,发现其实实现的原理也是方式三,调用的是obtain()方法,所以下面着重分析obtain方法: public fina

ysh_123 928

MineMap开发教程: 北斗网格位置码实时调度技术详解

本文介绍了MineMap4.0引擎中北斗网格位置码的实时调度技术。北斗网格位置码是我国自主研发的空间位置编码标准,具有层次化结构、三维编码等特点。MineMap4.0通过BeiDouGrid类实现了高效的实时调度机制,重点展示了按预想高度进行网格调度的核心功能。关键技术包括视锥体裁剪、LOD控制、高度筛选算法和交互式查询等。该技术在智慧城市、环境监测等领域具有广泛应用前景,凭借高性能、高精度等优势,为三维地理信息可视化提供了有力支撑。

weixin_42568040的博客 1439

飞书日历同步Outlook翻车?我踩过的坑和最终用Google Calendar成功的完整配置记录

本文详细记录了从Outlook日历同步到飞书时遇到的常见问题及解决方案,特别是通过Google Calendar实现稳定同步的完整配置流程。文章揭示了Outlook同步方案易翻车的原因,并提供了Google Calendar的避坑指南、高级技巧和企业级部署建议,帮助用户高效实现日历同步。

weixin_33724046的博客 313

handler.obtainMessage()理解

在handler.obtainMessage()的参数是这样写的:Message android.os.Handler.obtainMessage(int what, int arg1, int arg2, Object obj)public final Message obtainMessage (int what, int arg1, int arg2, Object obj) Since: ...

weixin_34228617的博客 501

自然二进制数与格雷码的相互转换

自然二进制数与格雷码两者优势: 自然二进制数的编码方式简单明了,容易理解,在加减运算中能够直接进行,同时十分方便进行一些位运算操作(如移位、取反等)。 格雷码计数时只有一位变化,可有效减少计数器状态的冗余转换,同时在传输数据时能够减小传输错误的概率,此外带权重编码处理更加方便。 在一定程度上自然二进制数与格雷码优缺点基本相反,综上所述,自然二进制数和格雷码各有优劣之处,需要根据具体应用场景选择合适的编码方式。简单来说,在计数器和编码器中,倾向于使用格雷码;而在进行加减运算时,则倾向于使用自然二进制数。

Loudrs的博客 7491

android message 代码,Android 异步消息处理机制前篇(二):深入理解Message消息池(示例代码)...

版权声明:本文出自汪磊的博客,转载请务必注明出处。上一篇中共同探讨了ThreadLocal,这篇我们一起看下常提到的Message消息池到底是怎么回事,废话少说吧,进入正题。对于稍有经验的开发人员来说我们在使用Handler发送异步消息获取Message的时候都会使用如下代码获取一个Message对象:1 Message msg = mHandler.obtainMessage();而不是直接ne...

weixin_35824356的博客 278

【VSCode Python无法格式化代码】

提示:需要Install Formatter…安装插件autopep8,点击install。出现Format Document。

AIFRZ的博客 1万+

YOLO11涨点优化:Loss魔改 | WIoU (Wise-IoU) v3版本全面替换,基于动态非单调聚焦机制,让模型更聪明地学习

YOLOv11目标检测中的WIoU v3损失函数改进 本文探讨了YOLOv11目标检测模型中CIoU损失函数的局限性,并提出了WIoU v3改进方案。关键发现包括: CIoU的缺陷:在低质量样本(小目标/遮挡目标)上过度惩罚,导致模型优化方向偏离,小目标AP往往比大目标低30%左右。 WIoU v3的创新: 动态非单调聚焦机制:根据样本"离群度"智能分配梯度 让模型重点优化中等质量样本,减少对低质量样本的无效关注 采用指数移动平均来自适应调整质量评判标准 实际效果:WIoU v3在保持大

2601_95807009的博客 422

Android之Handler详解(二)

二:sendMessage版本的Handler的使用 这里介绍几种模型: a、默认的Handler(消息处理队列挂在主线程上)  Java代码   [java] view plaincopy "font-size:16px;">    package com.dxyh.test;                 import android.app.Activit

YUZHIBOYI的专栏 2740

Skills入门学习路线

简单来说,Skills就像是给Claude准备的”插件包"或”工具箱”。它是一个集合,里面装了特定的操作指令(Instructions)、可执行脚本(Scripts)和相关素材(Resources)。2025 年 10 月中旬,Anthropic 正式发布 Claude Skills。两个月后,Agent Skills 作为开放标准被进一步发布,意在引导一个新的 AI Agent 开发生态。OpenAI、Github、VS Code、Cursor 均已跟进。为了更好的理解,你可以把。

十二测试录 1098

Android Handler 机制详解(二)源码解析

文章目录Android Handler 机制详解(一)源码解析Handler简介基本用法源码分析消息入队机制分析循环机制四个类的关系消息处理机制收尾 Android Handler 机制详解(一)源码解析 Handler简介 初学者对于handler的认识就是切换线程更新UI,但如果你分析过Handler的源码之后,你会发现Handler机制对于整个APP的运行起到了至关重要的作用,而不只是简简单...

qq_43747542的博客 544

【入门AUTOSAR网络管理测试】RSS-PBM状态转换

随着智能电动汽车行业的快速发展,目前AUTOSAR网络管理也得到了广泛应用,AUTOSAR网络管理测试也是汽车网络测试中非常重要的环节,NM问题导致的汽车ECU不能唤醒、电瓶亏电等问题,对于新入门AUTOSAR网络管理测试的同学不清楚如何开展测试,那么本章节就主要给大家介绍网络管理中RSS-PBM状态转换如何测试。【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读。

测试领域技术分享 872

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Android】Handler机制源码详解(二)

【Android】Handler机制源码详解(二)

qwe1626的专栏 542

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android学习笔记:关于Handler的详解(二)

4.handler移除消息 5.handler移除消息的内容 6.handler消息通信机制的原理 7.如何实现一个与子线程相关的handler 8. Android中更新ui的几种方式。

u012156341的专栏 992

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Handler详解(二)---关联到非UI线程

讲解HandlerThread

跟着大数据和AI去旅行 1778

android 之 Handler 详解----(二)常见的使用的基本方式

之前了解了系统中 Handler到底是怎么传递消息的,handler的一般的使用,我们都了解,下面是我两方面基本使用的认识: 1.  子线程向main线程发消息 2. 子线程和main线程相互发消息 代码中有详细说明: package com.example.handlerdemo; import android.app.Activity; import android.os.B

禤的技术空间 438

Handler详解系列(二)——主线程向自身消息队列发消息

MainActivity如下: package cc.c; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.view.View; import android.view.View.OnClickList

谷哥的小弟 2328

Golang 结构化日志包 log/slog 详解(二):Handler

默认情况下,输出的日志格式是普通的 text 格式,这种格式并不是最适合日志系统的格式。日志系统一般采用 SON 格式或者 key=value 类型的文本格式,log/slog 包也提供了对应功能。

路多辛的所思所想 1034

android 回调函数例子,Android的Handler Looper Message机制应用实例与详解(二)

Android的Handler Looper Message机制应用实例与详解(二)发布时间:2020-06-21 12:43:26来源:51CTO阅读:1638作者:sprocessor上一篇博文给出了Android中基于Handler Looper机制实现线程间通信的两个典型实例。本文将对该机制的基本原理进行较深入的研究。个人认为,学好Android编程最好的老师就是Android的源代码,下...

weixin_42462382的博客 315
上一篇: Handler详解一
下一篇: adb shell下查看sqlite数据库
慕广陵
博客等级 码龄17年 3粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值