MessageQueue源码分析

2017-05-16  本文已影响0人  tiancijiaren

MessageQueue提供了什么?和Looper、Handler、ThreadLocal、Message共同提供消息发送分发机制。MessageQueue提供消息队列功能,队列中保存Message作为节点,以单向列表实现。

MessageQueue提供了插入删除消息(包含普通消息和异步消息)、插入删除消息屏障、获取消息、增加删除idle状态的处理、队列清空。

Paste_Image.png

“同步分割栏”(消息屏障,具体叫什么都可以吧)可以被理解为一个特殊Message,它的target域为null。它不能通过sendMessageAtTime()等函数打入到消息队列里,而只能通过调用Looper的postSyncBarrier()来打入。
什么情况下会用到消息屏障呢?当需用通过handler接受的消息和另外的特定事件无法确定执行顺序,并且handler的消息要在特定事件发生后才可以执行时,需要使用消息屏障。例如:当在activity启动时,需要加载界面,其中有一个图片要加载到一个ImageView中,为了提高效率,同时执行界面和图片的加载,那图片加载必须要在界面加载结束后才可以设置到ImageView中,此时可以通过消息屏障来实现。

“同步分割栏”是起什么作用的呢?它就像一个卡子,卡在消息链表中的某个位置,当消息循环不断从消息链表中摘取消息并进行处理时,一旦遇到这种“同步分割栏”,那么即使在分割栏之后还有若干已经到时的普通Message,也不会摘取这些消息了。请注意,此时只是不会摘取“普通Message”了,如果队列中还设置有“异步Message”,那么还是会摘取已到时的“异步Message”的。

在Android的消息机制里,“普通Message”和“异步Message”也就是这点儿区别啦,也就是说,如果消息列表中根本没有设置“同步分割栏”的话,那么“普通Message”和“异步Message”的处理就没什么大的不同了。

Paste_Image.png

/*

package com.hfbank;

import android.os.Binder;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
import android.util.Log;
import android.util.Printer;

import java.util.ArrayList;

/**

上一篇下一篇

猜你喜欢

热点阅读