Android 消息机制的源码分析

    xiaoxiao2021-03-25  111

    安卓源码分析

    ActivityThread

    该类的main()函数,是在主线程执行的,在这里我们把他当做程序的入口 public static final void main(String[] args) { ... Looper.prepareMainLooper(); Looper.loop(); ... } 可以看到在main 方法中调用了 两个方法 Looper.prepareMainLooper(); 来初始化消息机制(后文称之为消息轮询器) Looper.loop(); 方法来开始轮询消息

    Looper

    Looper.prepareMainLooper(); 我们看下这个方法它做了什么 private Looper() { mQueue = new MessageQueue(); mRun = true; mThread = Thread.currentThread(); } public static final void prepareMainLooper() { prepare(); ... } public static final void prepare() { ... sThreadLocal.set(new Looper()); } 我们看到,在这个方法中调用了prepare()方法, prepare()方法直接new Lopper(); 放在当前线程的ThreadLocal中. Looper的构造方法里面 new MessageQueue(); 创建了一个消息队列.在prepareMainLooper()方法中, 创建了Looper 和 MessageQueue.Looper.loop();我们看下这个方法做了什么呢 public static final void loop() { Looper me = myLooper(); MessageQueue queue = me.mQueue; while (true) { Message msg = queue.next(); // might block //if (!me.mRun) { // break; //} if (msg != null) { if (msg.target == null) { // No target is a magic identifier for the quit message. return; } if (me.mLogging!= null) me.mLogging.println( ">>>>> Dispatching to " + msg.target + " " + msg.callback + ": " + msg.what ); msg.target.dispatchMessage(msg); if (me.mLogging!= null) me.mLogging.println( "<<<<< Finished to " + msg.target + " " + msg.callback); msg.recycle(); } } } loop(); 方法里面是一个while(true)的死循环,一直在遍历消息队列queue.next() 这是一个阻塞式的方法, 底层用到了java的管道流机制, 当队列中有消息的时候该方法就会执行, 没消息,就阻塞.

    MessageQueue

    - 消息队列

    未完待续 …

    转载请注明原文地址: https://ju.6miu.com/read-8038.html

    最新回复(0)