240 发简信
IP属地:四川
  • 120
    Android组件化架构 —— 基础(一) - 组件化与集成化

    什么是组件化? 回答这个问题前,我们先假设一个场景: 随着公司业务越来越好,原先的App团队开始划分为多个业务小组,例如:用户组(负责维护用户信息相关业务,如:登录、注册等)...

  • 120
    AndroidStudio发布代码到JCenter

    前言 作为一个有了一定开发经验的程序员,你一定或多或少封装了一些库,用以应付一些日常的通用功能,如果每次都拷贝这些代码,或者从Git上clone下来,未免过于麻烦,且不优雅。...

  • @IMGypsophila 非常感谢您指出错误,是我的错,一开始没有看到get方法里面核心,也没有进入ThreadLocal这个类, 就武断认为只能是一个looper角色。刚刚我看了get方法核心。每次创建子线程的时候,get方法里面的getMap会为空。最终会执行 createMap 方法。

    Android异步通信:手把手带你深入分析 Handler机制源码

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 今天,我将手把手带你深入分析 Handler机制的源码,希望你们会喜欢 Anroid异步通信Hand...

  • 我太武断了。作者不好意思哟,我错了~~~:sob:

    Android异步通信:手把手带你深入分析 Handler机制源码

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 今天,我将手把手带你深入分析 Handler机制的源码,希望你们会喜欢 Anroid异步通信Hand...

  • @Gxinyu 迷途知返,为时不晚:joy:

    Android异步通信:手把手带你深入分析 Handler机制源码

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 今天,我将手把手带你深入分析 Handler机制的源码,希望你们会喜欢 Anroid异步通信Hand...

  • 写的挺好的,很多地方讲的很详细。但有一段话
    “即 主线程的Looper对象自动生成,不需手动生成;而子线程的Looper对象则需手动通过Looper.prepare()创建
    在子线程若不手动创建Looper对象 则无法生成Handler对象”

    我要纠正下
    1、不管是主线程还是创建多个子线程,Looper角色只有一个,而且是主线程的Looper,不会存在多个Looper。
    就假设子线程的Looper对象是手动通过Looper.prepare()创建的,我们看这个方法,最后会执行一个判断 if (sThreadLocal.get() != null)
    主线程已经创建了Looper并且已经给sThreadLocal进行set了,那么这里将直接进入判断抛出异常。所以我认为不管是主线程还是创建多个子线程,Looper角色只能有一个。
    2、我们在生成Handler对象时,是调用的 mLooper = Looper.myLooper();这个方法来获取对应的Looper角色,而这个方法返回的是 return sThreadLocal.get();
    而这个值在主线程main方法里, Looper.prepareMainLooper();已经sThreadLocal这个变量里设置了唯一的一个Looper角色。

    为了让这篇文章更完美,最后我再加一点东西。
    未发送消息时,MessageQueue的next方法nativePollOnce(ptr, nextPollTimeoutMillis)这个方法,nextPollTimeoutMillis为-1时候,一直阻塞,直到被唤醒(这里作者已经写出来了)
    发送消息时,在MessageQueue的enqueueMessage通过nativeWake方法唤醒,底层是epoll机制,通过往pipe管道写端写入数据来唤醒主线程工作,当线程唤醒nativePollOnce就不会阻塞,继续往后执行,取消息,以及分发消息

    如果以上我分析的不对,欢迎大佬们指出来,我好改正。

    Android异步通信:手把手带你深入分析 Handler机制源码

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 今天,我将手把手带你深入分析 Handler机制的源码,希望你们会喜欢 Anroid异步通信Hand...