android 消息机制

        Android的消息机制是指handler的运行机制,handler的运行需要底层的messagequeue和loop的支撑。messagequeue的中文翻译是消息队列的意思,顾名思义,它的内存储存了一组信息,以队列的形式,对外提供插入和删除操作。虽然叫消息队列,但是他内部是用单链表的形式来对消息进行储存的。

         

   looper这里可以理解为消息循环。因为messagequeue只是作为一个消息储存的功能,但是他不具有处理消息的功能,而looper刚好填补了这个功能。looper会以无限循环的模式去查找新消息,如果有的话,就去处理新消息,否则就一直等着。looper还有一个概念就是Threadlocal。threadLocal并不是一个线程。它的作用是在每个线程中存储数据。我们知道handler在创建的时候,会通过looper来构建消息循环系统。那么hangdler内部是如何得到当前线程的looper的呢?那就是通过threadlocal来获取的。但是需要注意的是,线程是没有默认looper的,就拿ui线程activity。thread来说,activitythread在被创建的时候就初始化了looper这也是在ui 中可以使用handler的原因。

     

    各位开发者都知道,我们在Android中访问ui只能在主线程中进行,但是在主线程中我们不能使用超时操作,否则,就会使得anr。这个时候我们获取数据什么的就必须在子线程中获取,通过handler来更新主ui。

在这里延伸一点为什么在子线程不能更新ui。这是因为Android的ui控件不是线程安全的,如果在多线程中并发的更新ui会导致不可预期的状态。那怎么就不采取线程锁呢?因为线程锁会造成ui的逻辑复杂性,导致速度变慢,因为同步锁回去阻塞一部分县城。所以在Android中采用的一个主ui线程,来控制整个进程的运行。

    

  handler创建成功后,其内部的looper和messagequeue就和looper一起协同工作了。然后通过handler的post方法将一个runable投递到handler的looper中去了。也可以通过handler的send方法去发送一个消息,这个消息同样会在handler的looper中去处理。其实post最终也是通过send来完成的。我们来看看send的工作原理:

 

  当handler的send方法被调用时,他会调用messagequeue的enqueuemessage的方法,将这个消息放入消息队列中。然后looper发现有新消息到来时就会处理这条信息,当最后消息中的runable或者handlemessage方法就会被调用。注意:looper是运行在创建handler的线程中的,这样一来handler中的逻辑就被切换到handler所在的线程中去执行了。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值