Andriod中Handler,Looper,MessageQueue的关系

来源:互联网 发布:mysql 5.1.32.tar.gz 编辑:程序博客网 时间:2024/05/21 07:54

把所有主要的逻辑通过关键代码展示出来:


通常,我们的代码:

Handler mHandler = new Handler(){......}


Handler:

public Handler() {        ......        mLooper = Looper.myLooper();        if (mLooper == null) {            throw new RuntimeException(                "Can't create handler inside thread that has not called Looper.prepare()");        }        mQueue = mLooper.mQueue;

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());    }

    private Looper() {        mQueue = new MessageQueue();        mRun = true;        mThread = Thread.currentThread();    }



public static final void loop() {        Looper me = myLooper();        MessageQueue queue = me.mQueue;        while (true) {            Message msg = queue.next(); // might block                      if (msg != null) {                if (msg.target == null) {                    // No target is a magic identifier for the quit message.                    return;                }......                msg.target.dispatchMessage(msg);//target即是handler


MessageQueue:

    final Message next() {        boolean tryIdle = true;        while (true) {            ......            // Try to retrieve the next message, returning if found.            synchronized (this) {                now = SystemClock.uptimeMillis();                Message msg = pullNextLocked(now);


    final Message pullNextLocked(long now) {        Message msg = mMessages;        if (msg != null) {            if (now >= msg.when) {                mMessages = msg.next;

Message相当于一个单链表的形式,msg.next来访问下一个节点
原创粉丝点击