文章目录 一、什么是handler 二、handler消息机制原理 三、Handler消息机制组件 Handler Message Looper MessageQueue 三、Handler的三种使用方式...方法二:将Handler声明为静态类,activity使用弱引用赋值进去 一、什么是handler 二、handler消息机制原理 handler消息机制原理:本质就是在线程之间实现一个消息队列(MessageQueue...生产者Handler在异步线程通过sendMessageDelayed() 将消息添加至MessageQueue, 消费者Looper通过loop()中死循环将MessageQueue中的msg取出后发送给产生此...2、另外,如果你执行了Handler的postDelayed()方法,该方法会将你的Handler装入一个Message,并把这条Message推到MessageQueue中,那么在你设定的delay到达之前...,会有一条MessageQueue -> Message -> Handler -> Activity的链,导致你的Activity被持有引用而无法被回收。
Handler、Looper、MessageQueue基本了解可以看下这篇文章 Android源码解读-Handler、Loop、MessageQueue 一、MessageQueue如何实现Message...Handler可以接受来自binder线程的数据,比如收到msg=H.LAUNCH_ACTIVITY,添加到MessageQueue中,Looper监测有数据了,通过Handler,把消息发出去,最终则调用
} //将待插入节点 Node 插入到最后 realLastNode.next = node; } } } MessageQueue...中的 msg 入队 有了上面的知识,我们看一下MessageQueue 是怎么将 msg 入队的?...按照我个人的理解,有如下几点: 在MessageQueue中msg按照时间顺序进入消息队列 延迟越大的消息,越在队列的后面 假设发送消息的时间单位为秒 假设消息只入队,不消费....比如我们在 16:10:40s 入队一个消息 A,41s入队的消息 B,42s 入队消息C 则 BC都在 A 的后面, 因此在MessageQueue中 msg按时间顺序排队 顺序是 ABC 源码分析...public final class MessageQueue { boolean enqueueMessage(Message msg, long when) {
mHandler.sendMessage(msg) 非常熟悉的方法,跟踪这个方法,可以发现Handler通过enqueueMessage()的方法将Message消息对象放入MessageQueue消息队列中...private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target...} } // 对象池中是没有Message对象,那么会new 一个新的对象 return new Message(); } MessageQueue...MessageQueue 是消息队列,Handler对象通过内部方法queue.enqueueMessage将Message消息发送到MessageQueue中 boolean enqueueMessage...通过Looper.loop()不停的处理MessageQueue中的消息,直到消息队列为空,之前已经提到Loop通过queue.next()方法从MessageQueue 中获取等待处理的消息 /**
理解 一个Thread只有一个 Looper, 每个Looper都有它对应的MessageQueue。 多个Handler可以向MessageQueue发送Message或Runnable。...Looper依次处理MessageQueue中的Message(或Runnable),将Message发送给相应的Handler处理。...52142396 继续看当handler调用sendMessage的时候,会层层往下调用函数直到enqueueMessage这个函数 private boolean enqueueMessage(MessageQueue
类图 可以发现Fwk和Native都有一套Looper,而包含关系正好相反,Fwk层是Looper包含MessageQueue,而Native是MessageQueue包含Looper,Fwk的具体实现是完全由...从上述代码可以看到,loop的流程如下: 循环从MessageQueue中拿到待处理的Message 调用Message中target的dispatchMessage方法, Message的target...看下MessageQueue的next实现: Message next() { // Return here if the message loop has already quit...NativeMessageQueue实现 MessageQueue是这样构造的 MessageQueue(boolean quitAllowed) { mQuitAllowed...static void android_os_MessageQueue_nativePollOnce(JNIEnv* env, jobject obj, jlong ptr, jint
final MessageQueue queue = me.mQueue; .........获取消息,这MessageQueue是个阻塞式的队列。...Looper大致就这些,下面看下Handler Handler源码解析 无限循环遍历MessageQueue过程就这些,上面讲了如何获取Message以及MessageQueue如何阻塞的。...接下来是对遍历MessageQueue下来的Message进行处理。...这很好理解,when越小的越靠近对头,MessageQueue 是一个按照处理时间从小到大排序的队列,loop遍历MessageQueue是从对头开始获取数据。
本片文章的主要内容如下: 1、MessageQueue简介 2、MessageQueue类注释 3、MessageQueue成员变量 4、MessageQueue的构造函数 5、native层代码的初始化...6、IdleHandler简介 7、MessageQueue中的Message分类 MessageQueue官网 一、MessageQueue简介 MessageQueue即消息队列,这个消息队列和上篇文章里面的...需要注意的是Java层的MessageQueue负责处理Java的消息,native也有一个MessageQueue负责处理native的消息,本文重点是Java层,所以暂时不分析native源码。...MessageQueue构造函数.png 我们知道MessageQueue就一个构造函数 代码在MessageQueue.java 68行 MessageQueue(boolean quitAllowed...中就可以了,例如下面简答的代码所示 MessageQueue messageQueue = Looper.myQueue(); messageQueue.addIdleHandler(new
中的消息 , 分发给 Handler 处理 ; ④ MessageQueue ( 消息队列 ) : 封装在 Looper 中 , 每个 Looper 中封装了一个 MessageQueue , 是 Looper...Handler 机制 Handler Message Looper MessageQueue 四组件对应关系 ---- Handler , Message , Looper , MessageQueue...Looper 内部 , 每个 Looper 中只定义了一个 MessageQueue ( 消息队列 ) , 因此每个线程也只能有一个 MessageQueue ; 线程 与 Looper ( 消息遍历者...//获取 Looper 对象后 , 可以从 Looper 对象中获取 MessageQueue //关联后 , Handler 发送消息时 , 才能将消息精准的发送给 final MessageQueue...) 发送给 Looper 线程中的 MessageQueue 中 ; Looper 轮询该 消息队列 ( MessageQueue ) , 将消息再次分发给对应的 Handler 进行处理 ; IV
消息都是通过与 Looper 关联的 Handler 添加到 MessageQueue,而不是直接操作 MessageQueue。...小结: Looper 与 MessageQueue 是一一对应的关系。...Runnable 与 MessageQueue Handler 的 postXXX 系列方法用于调度 Runnable 对象,那它最后也是和 Message 一样被加到 MessageQueue 的吗?...Looper 与 MessageQueue 是一一对应的关系。...Handler 会对应一个 Looper 和 MessageQueue,而 Looper 与线程又一一对应,所以通过 Handler.sendXXX 和 Hanler.postXXX 添加到 MessageQueue
属性与构造器 Handler类中持有的实例,持有looper,messageQueue等等。...queue, Message msg, long uptimeMillis) // 接下来是MessageQueue添加消息 // MessageQueue.java boolean enqueueMessage...Message 和 MessageQueue 简介 与Handler工作的几个组件Looper、MessageQueue各自的作用: 1.Handler:它把消息发送给Looper管理的MessageQueue...对象,它负责管理MessageQueue,不断的从MessageQueue中取消息,并将相对应的消息分给Handler处理。...MessageQueue 持有一列可以被Looper分发的Message。一般来说由Handler将Message添加到MessageQueue中。
前言 我们知道android是基于Looper消息循环的系统,我们通过Handler向Looper包含的MessageQueue投递Message, 不过我们常见的用法是这样吧?...[图片] 一般我们比较少接触MessageQueue, 其实它内部的IdleHandler接口有很多有趣的用法,首先看看它的定义: [图片] 简而言之,就是在looper里面的message暂时处理完了
前言 我们知道android是基于Looper消息循环的系统,我们通过Handler向Looper包含的MessageQueue投递Message, 不过我们常见的用法是这样吧?...Looper.getMainLooper()).post(new Runnable() { @Override public void run() {/do something } }); 一般我们比较少接触MessageQueue...代码如下 Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() { @Override...field = Looper.class.getDeclaredField("mQueue"); field.setAccessible(true); MessageQueue...queue = (MessageQueue) field.get(sThread.getLooper()); queue.addIdleHandler(new MessageQueue.IdleHandler
(Native method) at android.os.MessageQueue.next(MessageQueue.java:325) at android.os.Looper.loop(...__JI+92) at android.os.MessageQueue.nativePollOnce(Native method) at android.os.MessageQueue.next(MessageQueue.java...__JI+92) at android.os.MessageQueue.nativePollOnce(Native method) at android.os.MessageQueue.next(MessageQueue.java...Native层其实各有一个MessageQueue,Java层的MessageQueue实际上是从Native层去获取其中的消息。...handler通过调用MessageQueue的enqueueMessage方法将消息压入MessageQueue。
作者:谷言 前言 我们知道android是基于Looper消息循环的系统,我们通过Handler向Looper包含的MessageQueue投递Message, 不过我们常见的用法是这样吧?...Looper.getMainLooper()).post(new Runnable() { @Override public void run() {/do something } }); 一般我们比较少接触MessageQueue...代码如下 Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() { @Override...field = Looper.class.getDeclaredField("mQueue"); field.setAccessible(true); MessageQueue...queue = (MessageQueue) field.get(sThread.getLooper()); queue.addIdleHandler(new MessageQueue.IdleHandler
文章目录 一、MessageQueue 空闲任务 IdleHandler 机制 二、MessageQueue 中空闲任务 IdleHandler 相关源码 一、MessageQueue 空闲任务 IdleHandler...机制 ---- 在 消息队列 MessageQueue 的 next 获取下一条消息的方法中 , 在循环获取消息的最后有如下代码 : public final class MessageQueue {...消息队列 addIdleHandler 函数如下 : public final class MessageQueue { /** * Add a new {@link IdleHandler...的 next 方法内的部分源码 : public final class MessageQueue { @UnsupportedAppUsage Message next() {...中空闲任务 IdleHandler 相关源码 ---- public final class MessageQueue { @UnsupportedAppUsage Message
中发送消息 , 并将消息放到 MessageQueue 中的 Message 链表队列的最后一个 ; 这就需要 Handler 持有 消息队列 MessageQueue 的引用 , 消息队列封装在 Looper...消息队列 Handler 的操作就是将 Message 放入 MessageQueue 因此在 Handler 中需要持有 MessageQueue...消息队列 Handler 的操作就是将 Message 放入 MessageQueue 因此在 Handler 中需要持有 MessageQueue...MessageQueue messageQueue = looper.mQueue; // 不断从 消息队列中获取 消息 , 分发到发送消息的 Handler 中执行...MessageQueue messageQueue = looper.mQueue; // 不断从 消息队列中获取 消息 , 分发到发送消息的 Handler 中执行
Android 消息机制主要涉及 4 个类: Message MessageQueue Handler Looper 我们依次结合源码分析一下。...在 MessageQueue 和 Looper 中都有。...MessageQueue MessageQueue 管理着一个 Message 的列表,Handlers 为它添加消息,Looper 从中取消息。 ?...何时初始化 MessageQueue 一般不直接访问,都是通过 Looper.myQueue() 方法获取一个消息队列。...是因为我二次使用了已经在使用的消息,在入队时 MessageQueue 检查发现后报的错。
//Looper的构造函数 private Looper(boolean quitAllowed) { //这里创建了MessageQueue mQueue = new MessageQueue...(quitAllowed); mThread = Thread.currentThread(); } 这里创建了MessageQueue为后续的步骤做准备,MessageQueue可以简单理解为一个...final MessageQueue queue = me.mQueue; .........在下面的Message从何而来中我们这里使用了hander向MessageQueue中存放了一条消息,导致loop被唤醒继续执行。...//调用MessageQueue的enqueueMessage()方法 return queue.enqueueMessage(msg, uptimeMillis); } 我们再来看一下MessageQueue