本文共 3837 字,大约阅读时间需要 12 分钟。
因为主线程(UI线程)的Looper在应用程序开启时创建好了,即在ActivityThread.main方法中创建的,ActivityThread.main函数为Android应用程序的入口
public static void main(String[] args) { ... Process.setArgV0(""); // 1. 创建消息循环Looper Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.attach(false); if (sMainThreadHandler == null) { sMainThreadHandler = thread.getHandler(); } ... //2. 执行消息循环 Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited");}
//在主线程中初始化Looperpublic static void prepareMainLooper() { //在这里会调用prepare(boolean quitAllowed)方法 prepare(false); synchronized (Looper.class) { if (sMainLooper != null) { throw new IllegalStateException("The main Looper has already been prepared."); } sMainLooper = myLooper(); }}//看下prepare(boolean quitAllowed)方法private static void prepare(boolean quitAllowed) { //判断sThreadLocal是否为null,否则抛出异常 //即Looper.prepare()方法不能被调用两次 //也就是说,一个线程中只能对应一个Looper实例 if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } //初始化Looper对象设置到ThreadLocal中 sThreadLocal.set(new Looper(quitAllowed));}//看下Looper的构造方法private Looper(boolean quitAllowed) { //创建了一个MessageQueue(消息队列) //这说明,当创建一个Looper实例时,会自动创建一个与之配对的MessageQueue(消息队列) mQueue = new MessageQueue(quitAllowed); mThread = Thread.currentThread();}
public static void loop() { //myLooper()方法作用是返回sThreadLocal存储的Looper实例,如果me为null,loop()则抛出异常 //也就是说loop方法的执行必须在prepare方法之后运行 //也就是说,消息循环必须要先在线程当中创建Looper实例 final Looper me = myLooper(); if (me == null) { throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread."); } //获取looper实例中的mQueue(消息队列) final MessageQueue queue = me.mQueue; Binder.clearCallingIdentity(); final long ident = Binder.clearCallingIdentity(); //进入消息循环 for (;;) { //next()方法用于取出消息队列里的消息 //如果取出的消息为空,则线程阻塞 Message msg = queue.next(); if (msg == null) { return; } final Printer logging = me.mLogging; if (logging != null) { logging.println(">>>>> Dispatching to " + msg.target + " " + msg.callback + ": " + msg.what); } final long traceTag = me.mTraceTag; if (traceTag != 0) { Trace.traceBegin(traceTag, msg.target.getTraceName(msg)); } try { //消息派发:把消息派发给msg的target属性,然后用dispatchMessage方法去处理 //Msg的target其实就是handler对象,下面会继续分析 msg.target.dispatchMessage(msg); } finally { if (traceTag != 0) { Trace.traceEnd(traceTag); } } if (logging != null) { logging.println("<<<<< Finished to " + msg.target + " " + msg.callback); } final long newIdent = Binder.clearCallingIdentity(); if (ident != newIdent) { Log.wtf(TAG, "Thread identity changed from 0x" + Long.toHexString(ident) + " to 0x" + Long.toHexString(newIdent) + " while dispatching to " + msg.target.getClass().getName() + " " + msg.callback + " what=" + msg.what); } //释放消息占据的资源 msg.recycleUnchecked(); }}
转载地址:http://mjqgn.baihongyu.com/