关于Handler机制以及Handler、Message、Looper的关系
2017-08-14 23:42
429 查看
本人应届生一枚,由于找工作需要,最近又重新撸了一遍Handler机制,正好借此机会养成写文档的好习惯,从此以后做一个游荡于csdn以及各个技术网站的孤魂野鬼。
首先,关于handler机制的机制类型,它是一个异步回调机制(至于异步回调是什么鬼,请自行百度)。
其次,我们一般在什么时候使用handler?
答:handler一般作用于线程之间的异步操作。
我们在了解Handler的时候,主要需要了解的就是Handler、Message、以及Looper之间的关系。
那么我们从Looper开始说起。
在线程刚刚启动的时候会通过ThreadLocal来新建一个Looper,然后Looper会创建一个MessageQueue,也就是存放我们发送的Message的地方啦。Looper会调用Looper.loop()方法指定当前的Handler,然后无限的去循环直至MessageQueue里面的每一个Message都被取出来通过dispathMessage(Message msg)方法将msg发送给指定的Handler。当MessageQueue里面没有Message的时候,线程就会阻塞,以保证内存的正常使用。这里需要注意的是ThreadLocal的作用就是保证每个线程只有一个指定的Looper。
public static final void prepare() {
if (sThreadLocal.get() != null) {
throw new RuntimeException(“Only one Looper may be created per thread”);
}
sThreadLocal.set(new Looper(true));
}
从这里我们就能看出每个线程只能有一个ThreadLocal对象;
然后我们再说Handler,我们在创建Handler之前必须先创建Looper,然后将Handler与Looper进行关联,而且由于我们需要将Message发送给指定的MessageQueue,如果不创建Looper我们就不知道将消息发送给谁。在创建的时候,线程会先查询消息池中是否有消息,如果有消息,直接取出来使用,如果没有就创建消息,我们通过Message.obtain()方法从消息池中取消息.。然后通过sendMessageAtTime()方法获取内部的MessageQueue,然后通过其中的enqueueMessage*(msg,uptimeMillis)*将消息发送到指定的MessageQueue中。
总结起来就是Looper是用来创建和管理MessageQueue的,它通过无限循环将MessageQueue中的Message取出,通过dispatMessage()方法发送给Handler。Handler是用来发送、接收和处理Message的,在创建Handler之前必须创建一个Looper然后与之关联,最后通过sendMessageAtTime()方法指定MessageQueue对象,并且发送Message。需要注意的是MessageQueue是一个单链表而不是一个队列,各位亲们不要被名字所迷惑了奥!!
代码出处出自鸿扬大神Android 异步消息处理机制 让你深入理解 Looper、Handler
8556
、Message三者关系
首先,关于handler机制的机制类型,它是一个异步回调机制(至于异步回调是什么鬼,请自行百度)。
其次,我们一般在什么时候使用handler?
答:handler一般作用于线程之间的异步操作。
我们在了解Handler的时候,主要需要了解的就是Handler、Message、以及Looper之间的关系。
那么我们从Looper开始说起。
在线程刚刚启动的时候会通过ThreadLocal来新建一个Looper,然后Looper会创建一个MessageQueue,也就是存放我们发送的Message的地方啦。Looper会调用Looper.loop()方法指定当前的Handler,然后无限的去循环直至MessageQueue里面的每一个Message都被取出来通过dispathMessage(Message msg)方法将msg发送给指定的Handler。当MessageQueue里面没有Message的时候,线程就会阻塞,以保证内存的正常使用。这里需要注意的是ThreadLocal的作用就是保证每个线程只有一个指定的Looper。
public static final void prepare() {
if (sThreadLocal.get() != null) {
throw new RuntimeException(“Only one Looper may be created per thread”);
}
sThreadLocal.set(new Looper(true));
}
从这里我们就能看出每个线程只能有一个ThreadLocal对象;
然后我们再说Handler,我们在创建Handler之前必须先创建Looper,然后将Handler与Looper进行关联,而且由于我们需要将Message发送给指定的MessageQueue,如果不创建Looper我们就不知道将消息发送给谁。在创建的时候,线程会先查询消息池中是否有消息,如果有消息,直接取出来使用,如果没有就创建消息,我们通过Message.obtain()方法从消息池中取消息.。然后通过sendMessageAtTime()方法获取内部的MessageQueue,然后通过其中的enqueueMessage*(msg,uptimeMillis)*将消息发送到指定的MessageQueue中。
总结起来就是Looper是用来创建和管理MessageQueue的,它通过无限循环将MessageQueue中的Message取出,通过dispatMessage()方法发送给Handler。Handler是用来发送、接收和处理Message的,在创建Handler之前必须创建一个Looper然后与之关联,最后通过sendMessageAtTime()方法指定MessageQueue对象,并且发送Message。需要注意的是MessageQueue是一个单链表而不是一个队列,各位亲们不要被名字所迷惑了奥!!
代码出处出自鸿扬大神Android 异步消息处理机制 让你深入理解 Looper、Handler
8556
、Message三者关系
相关文章推荐
- Handler由浅入深(二)--Handler的实现原理以及Looper、Handler、Message三者之间的关系
- Android 消息机制 以及Message、Handler、Message Queue、Looper之间的关系。
- Thread,Looper,Handler,Message,MessageQueue原理机制以及它们之间的关系
- Handler Looper Messagequeue Message 细节以及关系
- 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。
- Android中的Looper , Handler , Message的关系,异步消息处理的机制,根据源码分析
- Android 基础知识 Message MessageQueue Handler Looper 关系 图示
- Handler和Looper以及Thread的关系的简单备注
- 单线程模型中Message、Handler、Message Queue、Looper之间的关系
- android多线程编程详解,关于Handler ,Looper , Message , MessageQueue
- Thread和Looper以及Handler和Message详解 Android开发必读
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- 今天做到一道面试题:Handler+Looper+MessageQueue+Message的关系
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- Android笔记-MultiThreading in Android(1)-Thread,Looper,Handler,Message,MessageQueue之间的关系
- (八)Android中Handler、Looper、Message、MessageQueue的关系
- Android单线程模型中Message、Handler、Message Queue、Looper之间的关系---附实例源码
- 单线程模型中Message、Handler、Message Queue、Looper之间的关系
- 单线程模型中Message、Handler、Message Queue、Looper之间的关系
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系