handlemessageAndroid 请问Handler的sendMessage执行后是立即执行handleMessage方法吗?

handlemessage  时间:2021-06-11  阅读:()

安卓handler机制的原理!

andriod提供了 Handler 和 Looper 来满足线程间的通信。

Handler 先进先出原则。

Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。

1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。

2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。

3) Message Queue(消息队列):用来存放线程放入的消息。

4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。

android中Handler这个方法super.handleMessage(msg) 是什么意思

android.os.Handler.java 中为空,实际啥也没做。

public void handleMessage(Message msg) { } 你应该是说你写的类XXXXHandler继承了android.os.Handler吧。

XXXXHandler里面重写的handleMessage里面调用super.handleMessage(msg),就是调用了上面的空函数。

Android的handler机制的原理?

Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。

这种机制通常用来处理相对耗时比较长的操作。

  一、Handler的定义:   主要接受子线程发送的数据, 并用此数据配合主线程更新UI。

  解释:当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件, 进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。

如果此时需要一个耗时的操作,例如: 联网读取数据, 或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 "强制关闭"。

这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,,Android主线程是线程不安全的, 也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。

这个时候,Handler就出现了。

,来解决这个复杂的问题 ,由于Handler运行在主线程中(UI线程中), 它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据) , 把这些消息放入主线程队列中,配合主线程进行更新UI。

  二、Handler一些特点   handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),它有两个作用:   (1)安排消息或Runnable 在某个主线程中某个地方执行;   (2)安排一个动作在不同的线程中执行。

  三、Handler实例   子类需要继承Hendler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据。

handle是发出消息后就自动接收消息的吗?

我的理解: sendMessage(msg)和handleMessage(msg)分别在两个不同线程中,它们之间通过一个消息队列(MessageQueue)进行通信。

sendMessage(msg)是往队列插入数据 handleMessage(msg)是不断从队列中取出数据进行处理。

你说的是不是执行完sendMessage就立即调用handleMessage,这个不一定 handleMessage(msg)中一般都是比较耗时的操作(所以才要用多线程),sendMessage可能插入了100个数据,handleMessage才处理一个呢。

,如何吧这2个数据通过message发送给handle

private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); if (msg != null) { Log.d("debug", "msg.arg1=" + msg.arg1); Log.d("debug", "msg.arg2=" + msg.arg2); Bundle data = msg.getData(); int i = data.getInt("int"); ArrayList array = data.getStringArrayList("array"); } } };private void packHandler() { ArrayList array = new ArrayList(); array.add("a"); array.add("b"); array.add("c"); Message msg = new Message(); msg.arg1 = 1;//可以放一个int msg.arg2 = 2;//可以放一个int Bundle data = new Bundle(); data.putStringArrayList("array", array); data.putInt("int", 3);//可以放一个int msg.setData(data);//可以放ArrayList型 mHandler.sendMessage(msg); }

Android 请问Handler的sendMessage执行后是立即执行handleMessage方法吗?

在你写的代码里,Handler的sendMessage执行后是立即执行handleMessage方法的 调试运行没有问题是因为你一步步调试时需要时间的,而这个时间保证了你可能接收到全部数据了,然后调试到handler.sendMessage的时候,在handleMessage()里面就不会报空之类的错误,但是运行的时候在你数据还没接收到的时候就执行了handleMessage(),报错大概是这个原因吧

福州云服务器 1核 2G 2M 12元/月(买5个月) 萤光云

厦门靠谱云股份有限公司 双十一到了,站长我就给介绍一家折扣力度名列前茅的云厂商——萤光云。1H2G2M的高防50G云服务器,依照他们的规则叠加优惠,可以做到12元/月。更大配置和带宽的价格,也在一般云厂商中脱颖而出,性价比超高。官网:www.lightnode.cn叠加优惠:全区季付55折+满100-50各个配置价格表:地域配置双十一优惠价说明福州(带50G防御)/上海/北京1H2G2M12元/月...

限时新网有提供5+个免费域名

有在六月份的时候也有分享过新网域名注册商发布的域名促销活动(这里)。这不在九月份发布秋季域名促销活动,有提供年付16元的.COM域名,同时还有5个+的特殊后缀的域名是免费的。对于新网服务商是曾经非常老牌的域名注册商,早年也是有在他们家注册域名的。我们可以看到,如果有针对新用户的可以领到16元的.COM域名。包括还有首年免费的.XYZ、.SHOP、Space等等后缀的域名。除了.COM域名之外的其他...

HostKvm5.95美元起,香港、韩国可选

HostKvm发布了夏季特别促销活动,针对香港国际/韩国机房VPS主机提供7折优惠码,其他机房全场8折,优惠后2GB内存套餐月付仅5.95美元起。这是一家成立于2013年的国外主机服务商,主要提供基于KVM架构的VPS主机,可选数据中心包括日本、新加坡、韩国、美国、中国香港等多个地区机房,均为国内直连或优化线路,延迟较低,适合建站或者远程办公等。下面分享几款香港VPS和韩国VPS的配置和价格信息。...

handlemessage为你推荐
mac地址克隆mac地址克隆是什么意思。水晶易表水晶报表是什么?主要有什么用处?企业资源管理系统企业内部管理系统有哪些chrome系统Chrome OS是什么系统?labelforandroid:labelfor是什么意思超级播放器那种电影网站就是那种不需要下载播放器可以直接看activitygroupactivityGroup子activity跳转的问题中信银行理财宝中信银行理财宝金卡怎样激活私服发布站程序如何在电脑上建一个私服网站?有网站源码!私服发布站程序私服发布站
北京虚拟主机 国外vps租用 香港加速器 回程路由 patcha 国外空间 魔兽世界台湾服务器 cpanel空间 秒杀预告 免费活动 php空间购买 上海服务器 申请网站 腾讯总部在哪 东莞服务器托管 德隆中文网 免费稳定空间 深圳主机托管 双11促销 免备案jsp空间 更多