Android Handler机制

一、什么是Handler

Handler是Android中用来发送、传递、接收信息,处理更新界面UI的一套机制

二、Handler的作用

既可以发送消息,也可以处理消息

三、为什么要用Handler

Android在设计的时候,就封装了一套消息、传递、处理机制,如果不遵循这样的机制,就没有办法更新UI信息,就会抛出异常

四、Handler、Message、MessageQueue、Looper关系

Handler:快递员(属于某个快递公司的职员)
Message:包裹(可以放置很多东西的箱子)
MessageQueue:快递分拣中心(分拣快递的传送带)
Looper:快递公司(具有处理包裹去向的管理中心)
情景分析:在子线程中更新主线程的UI
其中的原理机制可以形象的理解为:

某天,你想给朋友寄一件礼物,首先你拿个箱子装好礼物并包裹好,下单叫了某家的快递员上门取件,快递员揽收你的包裹后,会将包裹送往快递分拣中心,等待配送车送出你的包裹。等配送车来了,就按照你的包裹地址信息,送到指定地方站点,然后分派给相应的快递员,将你的包裹送到你的朋友手里。

这整个邮寄包裹的过程可以形象的理解为Handler的工作机制原理,下面还原一下实际工作过程:
某时,你想刷新主界面的TextView,无奈你不在主线程,此时你就会包装好Message,然后声明一个Handler,让Handler将你的Message送往主线程(Looper),Handler将你的Message送到主线程后,还需要排队等待,等轮到你的时候,主线程就会告诉Handler,这个Message可以处理了,你负责分发一下,于是,Handler将该Message分发到相应的回调或者handleMessage( ) 方法中,于是,你就在该方法中更新了UI。

五、注意

1个线程只能绑定1个Looper,但可以有多个Handler

1个Looper可以绑定多个Handler,但一个Handler只能有一个Looper

六、Handler更新UI常见的方法

runOnUiThread()
handler.post()
handler.sendEmptyMessage()

view.post()

七、非线程可以更新Ui吗?

运行结果:

让线程休眠1秒:

报错了,原因是:

第一个例子中,子线程没有休眠,在Avtivity的生命周期的OnCreate()方法完成了,子线程中更新UI的操作。

第二个例子中,子线程发生了休眠,在Activity的生命周期的OnResume()方法完成了,checkThread()这个方法。而在Activity的Resume()方法会跑一个ViewRootImpl(),而这个ViewRootImpl()里会有一个checkThread()来判断更新UI的线程是不是主线程。如果不是就会抛出异常。

 

 

------------------------

可参考:https://blog.csdn.net/shengmer/article/details/78988563

https://blog.csdn.net/luoyingxing/article/details/86500542

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值