首页 > 系统 > Android > 正文

Android的消息机制

2019-11-09 16:42:53
字体:
来源:转载
供稿:网友
一、消息机制简介 1.Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层MessageQueue和Looper的支撑。 2.MessageQueue是采用单链表的数据结构来存储消息列表。 3.Looper会以无限循环的形式去查看是否有新消息,如果有就处理消息,否则就一直等待。 4.ThreadLocal可以在不同线程中互不干扰的存储并提供数据,通过ThreadLocal可以轻松的获取每个线程的Looper。

二、Android的消息机制分析 2.1 ThreadLocal的工作原理

1. ThreadLocal是一个线程内部的数据存储类,通过它可以在指定线程存储数据,数据存储后,只能在指定的线程可以获取到存储的数据,对于其他线程则无法获取到数据。一般来说,当数据是以线程作为作用域并且不同线程有不同副本的时候,就可以考虑使用ThreadLocal。对于Handler来说,它需要获取当前线程的Looper,而Looper的作用于就是线程并且不同的线程具有不同的Looper,通过ThreadLocal可以轻松实现线程中的存取。2. ThreadLocal的另一个使用场景是复杂逻辑下的对象传递。3. ThreadLocal原理:不同线程访问同一个ThreadLoacl的get方法,ThreadLocal的get方法会从各自的线程中取出一个数组,然后再从数组中根据当前ThreadLocal的索引去查找对应的Value值。

2.2 消息队列的工作原理

MessageQueue主要有两个操作,插入和读取,读取操作伴随着删除操作;MessageQueue是通过单链表的数据结构来维护消息列表的。enqueueMessage方法的作用是往消息队列插入一条消息。next方法是一个无线循环的方法,如果消息队列中没有消息,那么next方法会一直阻塞在这里。当有新消息到来时,next方法会返回这条消息并将其从单链表中移除。

2.3 Looper的工作原理

PRepareMainLooper方法主要给主线程也就是ActivityThread创建Looper使用的,本质也是通过prepare方法实现的。Looper提供quit和quitSafely来退出一个Looper,区别在于quit会直接退出Looper,而quitSafely会把消息队列中已有的消息处理完毕后才安全地退出。 Looper退出后,这时候通过Handler发送的消息会失败,Handler的send方法会返回false。 在子线程中,如果手动为其创建了Looper,在所有事情做完后,应该调用Looper的quit方法来终止消息循环,否则这个子线程就会一直处于等待状态;而如果退出了Looper以后,这个线程就会立刻终止,因此建议不需要的时候终止Looper。loop方法会调用MessageQueue的next方法来获取新消息,而next是是一个阻塞操作,但没有信息时,next方法会一直阻塞在那里,这也导致loop方法一直阻塞在那里。如果MessageQueue的next方法返回了新消息,Looper就会处理这条消息:mas.target.dispatchMessage(msg),这里的msg.target是发送这条消息的Handler对象,这样Handler发送的消息最终又交给Handler来处理了。

2.4 Handler的工作原理

这里写图片描述


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表