Gradle Plugin 能够允许我们在编译出的 jar 或 class 文件之后打包成 apk 之前修改文件 插件可以拿 java 、kotlin 或 groovy语言编写...

阅读全文 »

Handler 原理 1. Handler 被设计出来的原因?有什么用? 提供一种方便线程间通信的解决方案 2. Handler 的基本原理 外部通过 Handler 往 MessageQueue 里插入任务 Looper 在做死循环,一直从 MessageQueue 中获取任务 如果此时任务为空或当前没有需要执行的任务,则先判...

阅读全文 »

在 RecycleView 的 onMeasure 阶段,默认采用自动测量模式,如果自身宽高不确定,会尝试通过 LayoutManager 测量子 Item 来确定自己的宽高,所以尽可能的使用 match_parent 或固定宽高来布局 RecycleView,减少性能的损耗 在 RecycleView 的 onLayout 阶段,才会真正调用调用 LayoutManager.onLayoutChildren() 来对 Item 进行测量和布局 在 LayoutManager.onLayoutChildren() 方法中,会先通过 detachAndScrapAttachedViews() 函数回收布局,然后再通过 file() 函数进行布局,具体流程如...

阅读全文 »

SparseArray和ArrayMap SparseArray 1. 以双数组键值分开的形式存储,基于二分查找获取数据; 2. 采用int作为Key,避免了HashMap的装箱拆箱操作,同时它的数据结构不需要额外的Entry对象 3. 采用了延迟删除的机制(针对数组删除位移问题的优化),在remove时把目标值标记为delete,在下次有符合的值直接放到该位置,就没有位移了...

阅读全文 »

前置知识 分支:一个指向特定提交记录的**引用 指针:当前操作位置的引用 本地指针:我们能操作位置的引用...

阅读全文 »

虚拟机没有泛型,只有普通的类和方法 所有类型参数都用他们的限定类型替换 桥方法被合成来保持多态 为保证类型安全性,必要时插入强制类型转换...

阅读全文 »

1. 内部类实际会被编译成【外部类名$内部类名.class】的字节码文件,并自动在内部类中生成一个持有外部类的【final 外部类名 this$0】的变量,由构造函数进行赋值 2. 内部接口生成的字节码文件与第一点同理,并对接口函数进行【public abstract】声明 3. 匿名内部类则会将类名赋予数字的形式处理,如【外部类名$1.class】,构造函数与第一点相同,如果有调用外部函数变量,则还会在构造函数增加该函数变量参数,并复制给【final 类型 val$别名】的变量上 4. 如果内部类有调用外部类变量,则会在外部类生成一个静态函数【static 该外部类变量 access$000(外部类实例)】供内部类在调用外部类的地方使用...

阅读全文 »

每一个Thread维护一个`ThreadLocalMap`,通过`ThreadLocal`这个载体,在使用时变量为空则先创建`ThreadLocalMap`并赋值给线程再使用;`ThreadLocalMap`内部维护`table`数组,所有的数据都存在这里。 ...

阅读全文 »