phantomVK

Cease to struggle and you cease to live.

Android源码系列(20) -- setContentView

一、Activity mWindow 是 Activity 的数据成员,源码来自Android 27.1.1 public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, ...

RecyclerView缓存机制

一、RecyclerView与性能 使用 RecyclerView 的难度可大可小。仅作为单一类型列表展示,只要对视图布局进行优化,减低层次复杂度,几乎不可能存在性能问题。 若列表分类多、样式差异大,类似微信聊天消息界面,问题的难度提升不少。需要在预加载、复用上做进一步调优,单纯实现 onCreateViewHolder() 和 onBindViewHolder() 并不能满足需求。总的...

Java源码系列(22) -- ArrayBlockingQueue

一、类签名 ArrayBlockingQueue 为有界数组。队列元素顺序为先进先出。队头指针元素在队列内保存时间最长,队尾指针元素在队列内保存时间最短。新元素插入到队尾,而遍历操作则从队头获取元素。 public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements Blo...

Glide -- ResourceTranscoder

源码版本 Glide 4.8.0 ResourceTranscoder ResourceTranscoder 是 Glide 内类型转换器的抽象接口,表示资源从一种类型转换为另一种类型。泛型 Z 表示转换前资源的原始类型,泛型 R 表示资源转换后的目标类型。 public interface ResourceTranscoder<Z, R> { // 子类实现此方法,...

Dart配置运行

简介 相比 Java、Kotlin、Go 或 JavaScript,Dart 在开发语言中小众且冷门。而人们对 Dart 的关注度逐渐提升是因为 Flutter 的日渐兴起,其主要编程语言正是 Dart。Dart 和 Go 都是谷歌亲儿子,我个人短时间所产生的熟悉感,来自 Dart 的语法和 Kotlin 高度相像。两者都是面向对象、单继承、强类型且支持自动类型推断的语言。 现时 Dar...

Android源码系列(19) -- AsyncLayoutInflater

一、类签名 这是用于异步填充 View 的帮助类。在主线程构建 AsyncLayoutInflater 实例,并调用方法 inflate(int, ViewGroup, OnInflateFinishedListener)。视图填充完毕后在主线程回调 OnInflateFinishedListener 通知调用者。 public final class AsyncLayoutInflat...

Android源码系列(18) -- DiskLruCache

一、类签名 1.1 特性 这是基于文件系统的 LRU(Least Recently Used) 缓存类,并支持控制空间使用量。每个缓存条目都有一个字符串键和固定数量的值。每个键必须满足正则表达式:[a-z0-9_-]{1,120}。值都是字节序列,可通过流或文件的方式访问,长度在0到 Integer.MAX_VALUE 之间。 public final class DiskLruCac...

Java源码系列(21) -- Number

类定义 抽象类 Number 代表所有能从 数值型 转换到 基本类型 平台类的父类。这些基本类型包括 byte、double、float、int、long、short。 public abstract class Number implements java.io.Serializable 从特定 Number 实现的数值型到给定基本类型转换的特定语义,由所定义的 Number 实现...

空对象模式

空对象模式(Null Object Pattern),指通过特定的、没有负载有效数据的空对象,表示实例不存在的默认状态。可用在不能接受 null 的逻辑,或者利用空对象实现区别于实例为空的应用场景。 这是一般场景的用户模型,包含用户id和昵称: class User(private val userId: String, private val roomId: St...

禁止Windows10自动安装驱动

操作步骤: 1、右键开始菜单,选择 “运行” ,输入命令 “gpedit.msc” 并确定; 2、弹出本地组策略编辑器,按照下图路径展开: 3、进入 “Windows更新不包括驱动程序” 选项。双击打开,修改为已启动并确定即可。

HTTP/2约束Header大小写

起因 晚上 Android 客户端遇到奇怪的问题:在某台新配的服务器上,出现应用层获取 Header 自定义键 Authorization 时出现其值为空,但存在键 authorization 。 调查 通过抓包发现几个疑点: 问题以前没有出现,业务也是正常的,唯独连接到这台服务器会出现异常; 同一套代码,仅对这台服务器发出的请求行没有HTTP版本号,如:H...

EventBus源码剖析(5) -- Poster(完结)

一、Poster 这是所有 Poster 实现的共同接口,包含一个抽象方法。子类实现该抽象方法后,可接收到订阅记录 Subscription 和事件 Object。实现类需要根据自身特性,把事件按照既定模式发送给订阅者的接收方法。 interface Poster { // 把需要发送给指定Subscription的事件加到队列中 // @param subscripti...

EventBus源码剖析(4) -- 订阅记录

一、Subscription 订阅者进行注册时,EventBus 会扫描整个订阅者类,获取接收事件的具体方法,并构造出 Subscription 实例。每个订阅者可有多个方法接收订阅事件,每个方法生成各自的 Subscription 作为事件接收凭证。 订阅记录内主要包括3个成员变量: subscriber表示订阅类的实例; subscriberMethod表示订阅者内接受事...

EventBus源码剖析(3) -- 线程模式

一、简介 EventBus 消息支持通过不同线程模式发送并调起目标方法,以满足 Android 不同应用场景的要求。通过订阅者的订阅方法可知,线程模式通过注解参数进行配置。 二、用法 注册类必须包含至少一个接收事件的方法,如果不满足此条件,订阅类注册EventBus时会抛出异常。其次,订阅方默认在主线程被调起。 @Subscribe(threadMode = ThreadMode.M...

EventBus源码剖析(2) -- EventBusBuilder

上期文章 EventBus源码剖析(1) – 注册与注销订阅 介绍了订阅者向 EventBus 进行注册和注销的操作,并涉及部分 EventBus 初始化逻辑。 在初始化逻辑中,很多功能都由本文将介绍的 EventBusBuilder 提供。一般使用默认 EventBusBuilder 对象,但 EventBus 贴心地提供了定制的能力,以便满足不同需求。 一、类签名 通过自定义参数构...