Handler message looper三者间的信息通信
三者组成一个异步消息处理线程
在应用时、我们一般常重写handlerMessage方法,来刷新UI或者进行线程间的信息通信。但内部的实现过程我们需要通过查看源代码来了解。分析如下:
线程启动后,先调用Looper中的prepare()方法、方法中判断是否有Looper对象,没有则进行实例化并将其放入Threadlocal中。同时、Looper的构造函数中,实例化一个消息队列MessageQueue,存放信息及等待处理。
然后进入loop方法:获取Threadlocal中的Looper对象,取出消息队列;然后进入死循环:不断从消息队列中取信息,没有消息则线程阻塞、当有消息时调用msg.target.dispatchMessage(msg)方法。这里的msg.target就是Handler对象。
所以、Looper的作用:与当前线程绑定,保证一个线程只会有一个实例;同时一个Looper实例也只有一个MessageQueue。
现在有了MessageQueue 也有了不断取消息的动作。下面看Handler
先看Handler的构造函数:
public Handler(Callback callback,Boolean async){
mLooper = Looper.myLooper();
mQueue = mLooper.mQueue;
mCallback = callback;
}
构造函数中,获取了消息队列。然后看它的dispatchMessage方法
private void dispatchMessage(Message msg){
msg.target = this;//this 指代Handler
handlerMessage(msg);
}
所以、Handler在获取msg的同时、又将自己本身赋值给msg.target;如果MessageQueue一旦获取到msg;则又会调用handler自己来继续处理。
分享到:
相关推荐
通过自定义Handler、Looper、Message.浅析Android线程间通信原理
Handler+Looper+MessageQueue
在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按...
handler与looper及messagequeue的简单总结
Handler,Looper和Message的理解和练习
Android ,Handler,Looper,Message
在Handler类中的handleMessage方法中得到单个的消息进行处理,在单线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件进行信息交换...
Message,MessageQueue,Looper,Handler详解
Handler和looper详解.
Looper MessageQueue 源码解析,通过源码 手写一套自己的Handler。
这次项目用到的主要是Handler Thread Looper,希望对这三者关系还不是很清楚的人能通过我的项目读懂,当然我也不敢保证一定能
Android 异步处理 Handler+Looper+MessageQueue深入详解
Handler_Message_Looper小结
作用: 跨线程通信,异步通信。...MessageQueue(消息队列):由Looper负责管理,管理Handler发送过来的Message,其底层实现采用的是单链表。 Handler(处理者):负责Message的发送及处理。通过 Handler.send
Android Handler Looper
NULL 博文链接:https://null-point.iteye.com/blog/1356138
对于Android的Message机制主要涉及到三个主要的类,分别是Handler、Message、Looper;首先对每个类做一个简单介绍;然后再介绍所谓的Android的Message机制是如何实现的,最后给了一个示例。
摘要视图订阅标签: Android分类:目录(?Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系95220人
android源码中包含了...android的消息处理有三个核心类: Looper,Handler和Message。 其实还有一个Message Queue(消息队列) , 但是MQ被封装到Looper里面了, 我们不会直接与 MQ打交道, 因此我没将其作为核心类。
博客展示地址:http://blog.csdn.net/icedcap/article/details/20076615