消息机制发送和处理
2018-09-29 10:45:12 4 举报
消息机制的发送和处理流程
作者其他创作
大纲/内容
android_os_MessageQueue.wake
Looper.wake
通过mPtr获得NativeMessageQueue实例,并调用下面的方法
判断Message是否有callback来决定调用什么方法来处理事件
post请求需要传入一个Runnable,在方法里创建一个Message,并将Runnable放到Message的callback中
Handler.Handler
handler的构造函数可以传入一个Handler.Callback接口的实现类,并会把他放入成员变量mCallback中
1.这里根据传入的处理消息的时间戳来将Message插入MessageQueue,这里有4种可能,MessageQueue为空,Message时间为0,Message的时间早于MessageQueue头部的Message,这三种直接将Message放入头部,第四种则是Message的时间大于MessageQueue头部的时间,那么要循环MessageQueue找到对的位置并插入。2.Message放入MessageQueue之后检查目标线程是否要唤醒,如果Message插在中间或者插在头部但是目标线程没有睡眠则不需要唤醒,如果Message插在头部并且目标线程处于睡眠状态则需要走唤醒流程
调用write函数向目标函数发送了一个“W”,目标线程就会因为这个管道发生了一个IO写事件而被唤醒
Handler.handler
Handler.Callback.handleMessage
MessageQueue.enqueueMessage
当没有Callback的时候,直接调用了这个方法,这样不同的Message需要在这个方法里实现了
获得当前线程的Looper和MessageQueue放入成员变量中
Handler.handleCallback
HandleMessage
android_os_MessageQueue.nativeWake
1.sendMessage会调用sendMessageDelay,sendMessageDelay会调用sendMessageAtTime,真正发送消息的方法是在sendMessageAtTime2.判断queue不为空,将传入的Message的target指向这个Handler,并调用MessageQueue的enqueueMessage方法来发送消息
Handler.dispatchMessage
A线程
Handler.post
B线程
在无限循环中MessageQueue有了一个新的Message,根据判断调用全局变量Handler类型的target的下面的函数
Handler.sendMessage
因为在看代码时候的疑惑,现在在这里做个记录。举个例子:A线程创建Handler,B线程通过handler来发送信息Handler在A线程创建,所以Looper和MessageQueue都在A线程创建,当B线程调用了sendMessage,也就开始走上述的流程,但是其中的Looper和MessageQueue都是在主线程的实例。
Looper.loop
0 条评论
下一页