Android 消息机制的源码分析

来源:互联网 发布:中外企业大数据联盟 编辑:程序博客网 时间:2024/05/08 18:25

这里写图片描述

安卓源码分析

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

- 消息队列

未完待续 …

0 0
原创粉丝点击