android 消息机制

来源:互联网 发布:淘宝客服辛苦吗 编辑:程序博客网 时间:2024/05/18 00:13
        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所在的线程中去执行了。