View 的事件分发

事件分发的伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
boolean dispatchTouchEvent(MomentEvent ev){
boolean consume = false;
if(onInterceptTouchEvent(ev)){
//该 View 进行拦截
consume = onTouchEvent(ev);
}else{
consume = child.dispatchTouchEvent(ev);
}

returen consume;

}

阅读更多

Android Apk 签名机制

META-INF/CERT.RSA 是 apk 文件的证书

  • 检查 apk 文件中 META-INF/CERT.RSA 证书的指纹信息

keytool -printcert -file xxxx

阅读更多

Canvas 笔记

Path

  • arcTo 方法
    在 path 中的arcTo()方法只画弧形,不画扇形,所以没有 useCenter 这个参数
    其中的 arcTo(float left, float top, float right, float bottom, float startAngle,float sweepAngle, boolean forceMoveTo) 中的最后一个参数代表是否将画笔抬起,即强制将画笔的移到圆弧的起点再开始进行绘制

  • addArc() 方法
    这个方法与上一个方法的区别在于没有 forceMoveTo 这个参数,实际上等同于 arcTo(...,true) 方法

阅读更多

解决 Gradle 依赖冲突

版本冲突

当依赖两个库时,这两个库(A,B)中又同时依赖于另一个库(C),如果这个时候 A,B 中依赖的 C 库版本不同,Gradle 会自动使用最新的版本,比如

1
2
3
4
5
dependencies {
androidTestCompile('com.android.support.test:runner:0.4')
androidTestCompile('com.android.support.test:rules:0.2')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.1')
}
阅读更多

ViewModel 原理

ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。

如何使用

1
private val viewModel = ViewModelProvider(this).get(MyCustomViewModeClass::class.java)
阅读更多

Java 并发编程之 ReentrantLock


ReentrantLock,可重入锁,基于 AQS 的机制,实现了公平锁和非公平锁,给开发者提供了一个更为灵活的锁实现,既然是个锁,ReentrantLock 也实现了 Lock 接口

阅读更多

Java 并发编程之 AQS


AQS,全称为 AbstractQueuedSynchronizer,是 JUC 包中的一个抽象类,为开发者提供了编写同步锁的机制
其中封装了 FIFO(first in first out) 的队列

阅读更多

ConcurrentHashMap 源码阅读笔记


本文基于 JDK 1.8 分析

HashMap 是非线程安全的类,在多线程并发 put 导致 resize,在 transfer 过程中可能导致死锁或者数据丢失

而 ConcurrentHashMap 则是一个线程安全的 Map 类,在 HashMap 的基础上做了线程安全的处理

阅读更多

RxJava2 原理解析


RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.
RxJava 是 Reactive Extensions 的 Java VM 实现:一个使用可观察序列组合异步和基于事件的程序的库。

RxJava 通过观察者订阅被观察者进行事件的分发,并提供了很多被观察者(即事件发送者)的创建方法和事件转换的操作符函数(map、flatmap、filter 等等)

阅读更多