phantomVK

Cease to struggle and you cease to live.

Android源码系列(9) -- Activity事件分发

零、前言 发布的文章已经详细介绍 View事件分发 和 ViewGroup事件分发 ,了解点击事件如何在ViewGroup和View内部流动。如果把两者联系起来,容易知道ViewGroup把事件分发给View,当View不拦截事件时又把事件返回给ViewGroup。 本文研究Activity事件分发,探究事件如何从Activity分发到ViewGroup,ViewGroup不拦截事件Ac...

Kotlin lazy特性

一、用法 Koltin的lazy懒加载主要有以下两种用法,根据具体实现看来只有方法二是懒加载的。 用法一: 1 val strLazyOf by lazyOf("LazyString") 用法二: 1 val strLazy by lazy { "LazyString" } 二、Lazy接口 SynchronizedLazyImpl和InitializedLazyImpl均...

Java源码系列(8) -- ThreadLocal

一、ThreadLocal的作用 ThreadLocal 提供线程局部变量,以数据成员的形式存放在线程内,线程与线程之间副本相互独立。这些副本存放在 Thread.ThreadLocalMap,避免线程竞争同一实例造成等待锁的时间损耗。 Entry[1] : Entry.key通过弱引用持有ThreadLocal实例; Entry[10] : 没有强引用持有的ThreadL...

Android源码系列(8) -- LayoutInflater

一、基础用法 inflate()把传入的layout_res_id获得构建后的实例: 1 val view = LayoutInflater.from(this).inflate(R.layout.layout, null) 先了解源码中几个频繁出现的TAG_*字符串: 1 2 3 4 5 TAG_MERGE = "merge"; TAG_INCLUDE = "include"; ...

方法的JIT编译

Java方法执行一般会利用分层编译,先通过c1解释执行。方法执行编译等级逐渐提升,有机会通过JIT编译为特定平台汇编执行,以此获得最好的性能。 参数控制 方法执行除了达到一定热度外,是否JIT编译也受到以下两个参数影响: HotSpot默认不会编译巨型方法,也就是-XX:+DontCompileHugeMethods。通过修改参数为-XX:-DontCompileHugeMethods...

开启前台Service

Service 将 DaemonService 设置为前台服务,主要为了减小 oom_adj 值(oom_adj越小优先级越高),增加应用存活几率。在API为18或更高的版本,此方法会显示可见通知。为避免打扰用户,一般会启动另一个Service把出现的通知移除。最终达到通知栏没有常驻通知,但是oom_adj值减少的目的。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

Java CAS底层实现详解

前言 这篇文章将深入介绍CAS在JDK具体的实现方式,填补Java源码系列(7) – AtomicInteger中相关内容的空缺,主要从高层调用开始,经历JDK、JNI和asm汇编,最终调用处理器CAS指令集,带你浏览整个实现过程。 阅读需扎实Java基本功,了解或能看懂JNI和C语言。汇编没看过也没有关系,文章参考链接附带本文涉及所有汇编知识点以供查阅。 一、什么是CAS 多线程不...

下载OpenJDK源码

安装mercurial 在MacOS下示例,先通过easy_install安装mercurial 1 $ sudo easy_install mercurial 安装过程提示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 Searching for ...

Java源码系列(7) -- AtomicInteger

一、前言 AtomicInteger基于CAS(Compare and Swap,比较并修改)的操作,主要实现乐观锁的思想。 对悲观锁来说,它会假设线程并发竞争非常严重,每次修改数据先100%确保自己获得锁并进入临界区,再安心修改目标值,进而出现线程在竞争锁的过程中消耗大量时间在等锁、加锁、解锁等操作上。(注:锁还会涉及锁自旋、公平锁、锁队列等知识点) 相比之下的乐观锁,会假设线程冲突...

Java源码系列(6) -- LinkedList

一、介绍 Java常用的List实现有ArrayList和LinkedList。ArrayList通过数组实现,LinkedList通过链表实现。由于Java没有指针的概念,所以通过保存下一实例引用的方式实现链表。 1 2 3 public class LinkedList<E> extends AbstractSequentialList<E> ...

Java源码系列(5) -- HashSet

一、类签名 1 2 3 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable UML 二、数据成员 HashSet 利用HashMap实现特性,通过HashMap存储哈希值去重,key对...

EditText密码显示和隐藏

显示EditText内容为明文: 1 setTransformationMethod(HideReturnsTransformationMethod.getInstance()); 显示EditText内容为密文: 1 setTransformationMethod(PasswordTransformationMethod.getInstance()); 实现被点击图标的OnCl...

Kotlin中let, apply, with, run的差别和用法

前言 下面除了with之外,所有用例都来自Android生产代码。因项目没有实际使用with语法,所以通过其他例子来示意。在不影响理解的情况下,所有用例移除业务相关代码。 文章中使用的Kotlin版本是1.2.10,不同版本的Kotlin标准库实现可能会有差异。 一、let 调用传入的函数式。接收者为T,且用it指代T,返回值与函数式返回值一致。 1 2 3 4 5 6 7 8 /...

Glide4.0 StringSignature 找不到类

一、起因 旧版本Glide中.signature()方法形参支持使用StringSignature。但在Glide 4.0里面这个方法不仅被移到RequestOptions中,而且形参改为Key。 二、解决办法 2.1 Key 不过Key是一个接口,需要实现抽象方法 1 void updateDiskCacheKey(MessageDigest messageDigest); ...

Proguard在Mac OSX下的路径

这个文件夹下包含三个工具:proguard.jar,proguardgui.jar,retrace.jar 1 /Users/[username]/Library/Android/sdk/tools/proguard/lib 运行方式: 1 java -jar ****.jar