Android消息机制

具体就是解决子线程无法访问UI的矛盾问题

 

主要指的是Handler运行机制和Looper和MessageQueue的工作过程;

其实就是将某个任务切换到某个线程去执行,比如说子线程不能访问ui,只能在主线程里访问更新UI,子线程访问就会抛异常;

引申:

Android子线程为什么不能访问ui:因为ui线程里的控件都是非线性安全的。如多多线程同时访问同一个控件会引起不可预估的状态。这是不可控的。不可控就意味着致命。有的人可能会以为为啥不加锁。加锁肯定影响ui效率以及阻塞某些线程。肯定不可取。

Android消息机制的大体流程;

大家可以去看源码就能了解了;这里我大体记录一下精髓:

Handler向消息队列(MessageQueue)发送一条消息,MessageQueue通过.next()进行处理然后传给Looper,Looper通过Looper.loop()进行处理最终交给Handler进行分发处理,最总走HandleMessage(Message msg)方法处理。

一句话:Handler自己发送消息最总自己处理。因为Handler是主线程中创建的,最终是在主线程中完成ui的更新

源码缩减为:

Handler.setMessage->Handler.sendMessageAtTime->Handler.enqueueMessage->MessageQueue.enqueueMessage->MessageQueue.next()->Looper.loop()->Handler.dispatchMessage->3.HandleMessage;(或者1.Runnable的run方法或者2.CallBack.HandleMessage).  -------》源码可知:优先级1,2,3.

曾经16年面试有人问我说先有Looper还是先有Handler.   哈哈记忆犹新。

大家看过ActicityThread源码就清楚先有谁了。或者了解Handler的构造方法以及它的几个重载方法也可以了解。

 

引申:子线程一定不能更新ui吗答案是错误的。源码分析:涉及到ViewRoot。 能跟新ui的前提是ViewRootImpl这个对象没有创建出来,如果创建出来了子线程一定不能更新ui会抛异常。

 

其实用起来比较简单。创建Handler的时候注意一下内存泄露问题。基本就ok了。了解源码可以知其然挺好。

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值