Android开发Android技术知识Android开发

Android消息机制

2019-10-14  本文已影响0人  哇楼主

handler的运行离不开looper和messagequeen的支持,我们使用looper.prepare(looper.prepare(boolean quitAllowed))来创建一个looper,prepare方法中将创建的loopear存放到threadlocal(在指定的线程中存储数据,数据存储后,只能在指定的线程中读取)中,

image.png
在loopear的构造方法中,会创建一个messageQueen,用来存放message,至此,looper的准备工作已经完成 image.png

当我们调用looper.loop()方法时,会判断loopear有没有初始化,没有则抛出异常,拿到初始化的looper后,通过looper获取lopper中创建的messageQueen,然后通过死循环,不停的通过messageQueen.next()获取消息,当没有消息时将会阻塞等待新消息入队,直到messageQueen.next()返回null时,结束循环。当looper.loop方法中接收到消息时,会调用msg.target.dispatchMessage(msg);也就是handler的dispatchMessage(msg)方法,将消息交由handler处理,在Handler中会通过looper.myLooper()获取looper,在handler调用sendMessage(Message msg)方法时,会将message通过queue.enqueueMessage(msg, uptimeMillis);放入MessageQueen中,唤醒looper.loop的阻塞等待,进行后续处理。

public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
    MessageQueue queue = mQueue;
    if (queue == null) {
        RuntimeException e = new RuntimeException(
                this + " sendMessageAtTime() called with no mQueue");
        Log.w("Looper", e.getMessage(), e);
        return false;
    }
   // 将message放入messageQueen `方法内部调用queue.enqueueMessage(msg, uptimeMillis);`
    return enqueueMessage(queue, msg, uptimeMillis);
}
上一篇 下一篇

猜你喜欢

热点阅读