handler 随笔

来源:互联网 发布:mac 删除windows分区 编辑:程序博客网 时间:2024/05/22 15:08

ThreadLocal是一个线程内部存储数据的泛型类,

消息处理机制的流程:

Looper实现原理

1.调用prepare()方法,内部创建 looper对象并放入ThreadLocal中,looper对象内部  创建了ssageQueue

2.一般线程调用looper.prepare(), 主线程调用prepareMainLooper方法。

3.之后调用looper.loop()方法:

首先获取Looper对象,这里是从sThreadLocal获取的,对应的线程存放了自己内部的Looper对象。如果获取的Looper对象为null,则不会执行后续消息循环操作,如果不为空,则可以获取到looper对象中的消息队列,之前已经说明消息队列是在Looper的构造函数中初始化的,那么在此就可以获取到了mQueue。for是一个无限循环的操作,在调用MessageQueue的next方法,其作用是从消息队列中取出消息,在源码中有注释在此处可能会阻住,具体实现原理将在下一节中说明。如果消息队列中没有消息则退出循环操作。此循环中的核心代码msg.target.dispatchMessage(msg),target是一个Handler对象,这个对象就是发送消息的那个Handler对象,handler对象分发消息,在handler的dispatchMessage方法中会执行内部的处理消息的方法handleMessage()。消息分发完之后recycleUnchecked()执行消息的回收工作,将消息存入回收的消息池当中。

Message实现原理

Android应用程序是事件驱动的,每个事件都会转化成一个可以序列化的系统消息。而这个消息(Message)中包含了两个额外的整型数据字段和一个额外的对象字段。Message是一个可序列化的对象,what是Message的标识,如果需要存储的数据是int型的,那么可以存储到arg1,arg2,而需要存储序列化的对象时,可将数据存储到一个Bundle对象(data)中。



消息处理机制的流程:

1.首先在ActivityThread 中 调用,prepareMainLooper()方法,创建looper 对象 和 messageqeueu 对象。  之后执行loop方法,进行循环,遍历与之绑定的qeueu, 没消息阻塞,有消息就取出消息发送给对应的handler。 

2.接收到消息的handler,调用dispatchmessage方法分发,然后调用handmessage方法来进行处理。




0 0
原创粉丝点击