Handler ,Looper, MessageQueue架构原理解析

Looper源码中

1. prepare方法:目的是用户创建Looper对象.

public static void prepare() {
        prepare(true);
    }

    private static void prepare(boolean quitAllowed) {
        if (sThreadLocal.get() != null) {
            throw new RuntimeException("Only one Looper may be created per thread");
        }
        sThreadLocal.set(new Looper(quitAllowed));
    }

2, loop()方法: 用于在某个线程中启用一个循环来给handler发消息.

msg.target即为handler对象.

 public static void loop() {

        ...................

     for (;;) {
               Message msg = queue.next(); // might block
               if (msg == null) {
                   // No message indicates that the message queue is quitting.
                   return;
               }

           ...................

     try {
         msg.target.dispatchMessage(msg);
         end = (slowDispatchThresholdMs == 0) ? 0 : SystemClock.uptimeMillis();
      } finally {
         if (traceTag != 0) {
        Trace.traceEnd(traceTag);
     }
  }

}

 

3,对于android中mainlooper,就是在ActivityThread.java中main()函数中进行创建以及启动looper,代码如下:

        Looper.prepareMainLooper();

        ActivityThread thread = new ActivityThread();
        thread.attach(false);

        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }

        if (false) {
            Looper.myLooper().setMessageLogging(new
                    LogPrinter(Log.DEBUG, "ActivityThread"));
        }

        // End of event ActivityThreadMain.
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        Looper.loop();

从Looper类中的实现,可以看出调用了loop()后,最后为什么要quit()来结束loop.

那么怎么可以结束呢?看源码知,只有当msg为null的时候会结束for循环,即loop结束. 

有同学可能会认为当handler不发消息的时候,loop就自动停止了,答案是NO. 

4,接下来观察MessageQueue中next()的实现:

也是一个for循环, 我们查找return语句.

Message next() {

      for (;;) {

              // Process the quit message now that all pending messages have been handled.
                if (mQuitting) {
                    dispose();
                    return null;//关键点,只有当这个为null的时候,上面loop方法会结束for循环.

                 }             

       }

}

其中mQuitting是由loop的quit方法传值.

// from Looper类
public void quit() {
    mQueue.quit(false);
}

这就是整个消息loop机制原理.

大家可以分析下IntentService以及其中使用的HandlerThread,原理一样的.

有问题,大家可以留言交流...

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值