美文网首页Android开发经验谈Android开发移动开发
源码学习|Android Handler 消息机制源码分析(二)

源码学习|Android Handler 消息机制源码分析(二)

作者: 寒石 | 来源:发表于2016-06-18 17:16 被阅读204次

在上次我们分析到Handler在创建时会绑定一个Looper对象,而如果Looper用户不进行显式传入,会在Handler中调用Looper.myLooper()来创建一个Looper对象。 

那什么是Looper呢?Android中对于Looper类的注释中是这样描述的:“Class used to run a message loop for a thread”。大概意思是指这个类是用来为一个线程做消息循环。而Looper 类本身被声明为final类型的,同时它的构造方法也被声明为final类型。所以我们如果要获取其中的Looper实例或者使用Looper的方法需要使用其中提供的两种静态方法:

我们可以看到,无论是getMainLooper()方法还是myLooper()方法,获取的Looper都是直接返回已经初始化的对象。那它们的初始化在哪操作的呢?如下图所示:

我们可以看到,主线程Looper和子线程Looper创建的区别在于一个quitAllowed变量(主线程为false, 子线程为true)。而最终这个变量会传入到Looper构造方法中用于构造MessageQueue。而Looper中的线程绑定的是当前线程。如下图所示:

这样的话,结合上一篇,我们可以发现,直接在子线程中使用Handler handler = new Handler(),会调用Looper.myLooper()方法获取Looper对象,在这之前并没有调用Looper.prepare()方法进行初始化,所以sThreadLocal.get()中会返回null,进而报错。

那大家或许会问,主线程中的mainLooper是何时进行初始化的呢,为什么主线程中直接new Handler()不会报错呢?其实这个主线程Handler在应用启动时就已经进行了初始化,具体启动时机需要在后面继续分析呢~😊

ps:更新相关的两篇文章传送门:

《Android Handler消息机制源码分析(一)》 

《Android Handler消息机制源码分析(三)》

相关文章

网友评论

    本文标题:源码学习|Android Handler 消息机制源码分析(二)

    本文链接:https://www.haomeiwen.com/subject/oyxbdttx.html