android 消息机制 主要是四个对象: handle message looper. messagequeue.
简单进行总结: handle 通过sen dmessage 或postmessage 进行发送消息,通过重写handlermmessage的方法进行接受消息
2,message 是一个对象,里面包含了 what来区分消息,ob j 用来承载消息, w hen :用来确定延时的时间, target对象是与handler对象进行绑定,是那个handler 来处理消息
3,loop。是一个轮询器,通过looper.looper. ()的方法 进行获取到消息队列,通过next 的方法进行双重循环获取需要处理的消息
4,message queue 是一个链表结构,进行message的存储,最大容量是50,通过en queMmessage 将消息加入到消息队列中
ThreadLoacal 的工作原理:
ThreadLoacal是一个线程内部的数据存储类,通过他可以在指定的线程中存储数据,数据存储以后,只能在指定的线程中获取数据,对于其他线程是无法进行获取的。
消息机制流程:
APP 启动 创建全局唯一的looper 对象和全局唯一的messageQueue 对象
App 启动-----ActivityThread .main()执行----Looper.prepareMainLooper() —prepare() —创建全局唯一主线程Looper对象 --sThreadLoacal.set(new Looper(quitAllowe)) —创建全局唯一的主线程队列 —private Looper (boolean quitallowe){
mQueue= new MessageQueue(quitallowe);
mThread = Thread.setCurrenutThread();
}
2.handle 创建:
new handler 进行重新 handlerMessage()的方法
new handler是 会得到 全局的loop对象和messagequeue 对象
mlooper = Looper.myLooper(); mThreadLoacal.get(); 的方法进行获取
mqueue = mLooper.mqueue;
3.进行消息发送
Activity
mhandler.sendMessage(message) —> handler.sendMessageAtTime(message,time){
MessageQueue messagequer = mqueue;
return enqueueMessage(queue,msg ,time )
}private boolean enqueueMessage(){
msg.targe=this;
return equeue.enqueueMessage(msg,time);
}
MessageQueue中进行消息的全局设置
消息的发送
Actiivty.mian() 的方法中调用:
Looper.Loop(); 进行开启消息循环:
private static void Loop(){
final Looper myloop = myLooper();
final MessageQueue queue = myLooper.mQueue;
for (,){
Message msg = queue.next();//进行消息的获取
msg.targe.dispatchMessage() ;进行消息的发送, 最终调用 handler.handlerMessage();}
}
消息阻塞:
主要是在looper 中调用 loop方法, queue.next ()的方法中进行 消息的阻塞,,主要是有一个局部时间变量 nextpolltimeMill 如果这个值是0 ,则不进行阻塞,,如果是-1 则进行阻塞,,等带唤醒,,主要是调用native 方法 ,,进行阻塞。。 如果是一个数值,则是需要等待一段时间后再进行执行
唤醒机制,是在queue 的equeuemessage的方法,如果有新的消息插入,则进行native方法 nativePollOnce(ptr, nextPollTimeoutMillis); 将next 中的方法进行唤醒,。。而在message对象加入消息队列的时候,会通过 msg.when 的变量进行判断,插入到对应的位置
如何理解threadloacal 保证数据的唯一性,,
其实ThreadLoacal 里面有有个map集合,,而ThreadLoacal 中有set 和get 的方法,且 threadLoacla 是thread 的成员变量,这样可以保证当前的线程中ThreadLoacal是唯一的数据