关于Handler存在的理由和简单的Handler机制!

   在这表blog中,我并不介绍具体的handler知识,知识解释下这种机制存在的理由和我的一些基本认识。


之前想要实现子线程对于Android中UI的更新,但是又要必须知道UI一定要在主线程中才能更新(当然如果子线程拥有自己的VIewRoot,那么子线程可以更新UI,并且不通过handler机制,具体怎么做的,大家可以自行搜索一下),除此之外,必须要使用handler机制。

然后学习一番,大概知道了这些知识。。。。。。

 Tips:在这里,我觉得应该解释下为什么UI必须要在主线程中更新,我相信很多人都不太清楚,因为UI更新是线程不安全的,比如说你在UI主线程和子线程中同时刷新UI,有很大可能造成UI更新的不确定性,不知道UI显示的是主线程还是子线程的结果,当然不能让这样的方法存在。

1.也有人说,我在OnCreate方法中,就用子线程成功刷新了UI,原因是,在OnCreate方法中ViewParent还没有初始化完毕,此时系统不会去检测刷新UI的是什么线程,如果说你在OnResume中重新调用刚才的方法,肯定会出错的,因为此时ViewParent已经初始化完成,会发现更新的线程不是UI线程,并且抛出错误。

 2.还有人说,使用postInvalid函数可以实现在子线程中更新UI,然而事实是,当你打开postInvalid函数,你就会发现这个函数内部还是使用Handler机制来实现的。

那你可能会问了,为什么不适用多线程UI,曾经也有人试图用多线程的GUI,最终由于竞争条件和死锁导致的稳定性问题,又回到了单线程化的事件队列模型老路。


Handler机制:

  在主线程(UI)创建时,对应创建的有相应的Looper类,在这个Looper中有一个MessageQueue(就是存放Message的队列),这个队列中存放着UI线程即将去做的事件,而这个Looper就是不停的循环检查这个Message队列,如果有事情就去执行,而这些事件就可以通过handle去传送。

每个Handle都对应着唯一的一个Looper,但是同一个Looper可以有多个Handle,这就是为什么多个子线程可以通过handle去实现UI更新,因为他们都拥有UI线程的handle。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值