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(),报错大概是这个原因吧

艾云年付125元圣何塞GTT,洛杉矶vps年付85元

艾云怎么样?艾云是一家去年年底成立的国人主机商家,商家主要销售基于KVM虚拟架构的VPS服务,机房目前有美国洛杉矶、圣何塞和英国伦敦,目前商家推出了一些年付特价套餐,性价比非常高,洛杉矶套餐低至85元每年,给500M带宽,可解奈飞,另外圣何塞也有特价机器;1核/1G/20G SSD/3T/2.5Gbps,有需要的朋友以入手。点击进入:艾云官方网站艾云vps促销套餐:KVM虚拟架构,自带20G的防御...

Megalayer新加坡服务器国际带宽线路测评

前几天有关注到Megalayer云服务器提供商有打算在月底的时候新增新加坡机房,这个是继美国、中国香港、菲律宾之外的第四个机房。也有工单询问到官方,新加坡机房有包括CN2国内优化线路和国际带宽,CN2优化线路应该是和菲律宾差不多的。如果我们追求速度和稳定性的中文业务,建议还是选择CN2优化带宽的香港服务器。这里有要到Megalayer新加坡服务器国际带宽的测试服务器,E3-1230配置20M国际带...

易探云美国云服务器评测,主机低至33元/月,336元/年

美国服务器哪家平台好?美国服务器无需备案,即开即用,上线快。美国服务器多数带防御,且有时候项目运营的时候,防御能力是用户考虑的重点,特别是网站容易受到攻击的行业。现在有那么多美国一年服务器,哪家的美国云服务器好呢?美国服务器用哪家好?这里推荐易探云,有美国BGP、美国CN2、美国高防、美国GIA等云服务器,线路优化的不错。易探云刚好就是做香港及美国云服务器的主要商家之一,我们来看一下易探云美国云服...

handlemessage为你推荐
匹配函数Excel中vlookup函数数据匹配怎么用chrome系统Chrome操作系统是什么样的系统?qq网络硬盘怎么用qq网络硬盘腾讯技术腾讯QQ是谁研发的?在那一年上市的?单元测试规范单元场景测试是如何进行的?数据库界面数据库怎么进入界面人脸识别解锁oppo人脸识别解锁网络备份如何自运远程备份什么是网络地址什么是IP地址?挂qq网站那有挂QQ的网站啊
最新代理服务器 美国和欧洲vps 网易域名邮箱 免备案cdn bash漏洞 permitrootlogin 鲜果阅读 中国电信测网速 免费智能解析 idc查询 网页提速 国外在线代理服务器 深圳域名 实惠 国外网页代理 杭州电信 广东服务器托管 windowsserver2012r2 restart 什么是dns 更多