[源码分析]Android消息机制之MessageQueue类
2013-04-03 16:33
176 查看
package android.os; import java.util.ArrayList; import android.util.AndroidRuntimeException; import android.util.Config; import android.util.Log; import com.android.internal.os.RuntimeInit; public class MessageQueue { Message mMessages;//消息对象; private final ArrayList mIdleHandlers = new ArrayList();//空闲队列; private boolean mQuiting = false;//是否正在退出; boolean mQuitAllowed = true;//是否允许退出; public static interface IdleHandler {//接口; boolean queueIdle(); } //增加一个IdleHandler对象; public final void addIdleHandler(IdleHandler handler) { if (handler == null) { throw new NullPointerException("Can't add a null IdleHandler"); } synchronized (this) { mIdleHandlers.add(handler); } } //清楚一个IdleHandler对象; public final void removeIdleHandler(IdleHandler handler) { synchronized (this) { mIdleHandlers.remove(handler); } } MessageQueue() { } final Message next() { boolean tryIdle = true; while (true) { long now; Object[] idlers = null; synchronized (this) { now = SystemClock.uptimeMillis(); Message msg = pullNextLocked(now); if (msg != null) return msg; if (tryIdle && mIdleHandlers.size() > 0) { idlers = mIdleHandlers.toArray(); } } //如果现在消息队列中没有消息,而且mIdleHandlers队列中有数据,通知mIdleHandlers里面变量的回调; // There was no message so we are going to wait... but first, // if there are any idle handlers let them know. boolean didIdle = false; if (idlers != null) { for (Object idler : idlers) { boolean keep = false; try { didIdle = true; keep = ((IdleHandler)idler).queueIdle(); } catch (Throwable t) { Log.wtf("MessageQueue", "IdleHandler threw exception", t); } if (!keep) {//如果返回false直接把这个从队列中去掉哦; synchronized (this) { mIdleHandlers.remove(idler); } } } } if (didIdle) { tryIdle = false; continue; } synchronized (this) { try { if (mMessages != null) { if (mMessages.when-now > 0) { Binder.flushPendingCommands(); this.wait(mMessages.when-now); } } else { Binder.flushPendingCommands(); this.wait(); } } catch (InterruptedException e) { } } } } final Message pullNextLocked(long now) { Message msg = mMessages; if (msg != null) { if (now >= msg.when) { mMessages = msg.next; if (Config.LOGV) Log.v( "MessageQueue", "Returning message: " + msg); return msg; } } return null; } /** * 插入消息; */ final boolean enqueueMessage(Message msg, long when) { if (msg.when != 0) { throw new AndroidRuntimeException(msg + " This message is already in use."); } if (msg.target == null && !mQuitAllowed) { throw new RuntimeException("Main thread not allowed to quit"); } synchronized (this) { if (mQuiting) { //经常看到这条错误,意思就是handler此时已经为null了,也就是消息已经退出了哦; RuntimeException e = new RuntimeException( msg.target + " sending message to a Handler on a dead thread"); Log.w("MessageQueue", e.getMessage(), e); return false; } else if (msg.target == null) { mQuiting = true; } msg.when = when; Message p = mMessages; if (p == null || when == 0 || when < p.when) { msg.next = p; mMessages = msg; this.notify(); } else { Message prev = null; while (p != null && p.when <= when) { prev = p; p = p.next; } msg.next = prev.next; prev.next = msg; this.notify(); } } return true; } //移除一条消息; final boolean removeMessages(Handler h, int what, Object object, boolean doRemove) { synchronized (this) { Message p = mMessages; boolean found = false; while (p != null && p.target == h && p.what == what && (object == null || p.obj == object)) { if (!doRemove) return true; found = true; Message n = p.next; mMessages = n; p.recycle(); p = n; } while (p != null) { Message n = p.next; if (n != null) { if (n.target == h && n.what == what && (object == null || n.obj == object)) { if (!doRemove) return true; found = true; Message nn = n.next; n.recycle(); p.next = nn; continue; } } p = n; } return found; } } final void removeMessages(Handler h, Runnable r, Object object) { if (r == null) { return; } synchronized (this) { Message p = mMessages; while (p != null && p.target == h && p.callback == r && (object == null || p.obj == object)) { Message n = p.next; mMessages = n; p.recycle(); p = n; } while (p != null) { Message n = p.next; if (n != null) { if (n.target == h && n.callback == r && (object == null || n.obj == object)) { Message nn = n.next; n.recycle(); p.next = nn; continue; } } p = n; } } } //删除所有消息包含handler h和Object object 的消息; final void removeCallbacksAndMessages(Handler h, Object object) { synchronized (this) { Message p = mMessages; // Remove all messages at front. while (p != null && p.target == h && (object == null || p.obj == object)) { Message n = p.next; mMessages = n; p.recycle(); p = n; } while (p != null) { Message n = p.next; if (n != null) { if (n.target == h && (object == null || n.obj == object)) { Message nn = n.next; n.recycle(); p.next = nn; continue; } } p = n; } } } void poke() { synchronized (this) { this.notify(); } } }
相关文章推荐
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Handler,Looper,MessageQueue,android中的消息机制以及源码分析(一)
- android的消息处理机制(图文+源码分析)—Looper/Handler/Message[转]
- Android消息机制(Handler,Looper,MessageQueue)-源码分析
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Android的消息处理机制源码分析
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- [源码分析]Android消息机制之Thread类
- Android异步消息处理机制(二):源码分析
- android的消息处理机制(图文+源码分析)―Looper/Handler/Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message+10
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- 从源码分析Android中Handler的消息传递机制