Android 消息机制的源码分析

这里写图片描述

安卓源码分析

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

- 消息队列

未完待续 …

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值