Leo's Studio.

Leo's Studio.

It's a feature, not a bug.

Looper中的死循环
Handler 应该是每个 Android 开发同学都非常熟悉的组件了,和大部分的 GUI 程序类似,Android 上的 UI 绘制只允许在单个线程上进行。这也是 Google 提供了 Handler 的原因之一,为了方便在其他线程使用 Handler 来通知 UI 线程更新。关于 Handler 的使用和源码解析不是本文的主题,网上已经有很多不错的文章了。本文的主题是探讨下 Looper 类中的 loop() 方法。 我们知道,loop() 实质上是在一个无限的 for 循环中,从 MessageQueue 中不断地取出消息,再交由对应的 Handler 进行分发。这里实际上就涉及到...
Jetpack中的LiveData
关于LiveDataLiveData 是一种可观察的数据持有类,下面是常用的写法: 12345678910111213141516class DataViewModel(application: Application) : AndroidViewModel(application) { val dataSource: LiveData<String> = MutableLiveData() fun postValue(text: String? = "Hello World") { (dataSource a...
Jetpack中的Lifecycle
关于本文有很多项目都会使用 MVP 这种项目架构,使用 Presenter 来减轻 Activity 的负担,具体的 MVP 实现可以阅读 Google 推出的 android-architecture。 一般使用 MVP,都会遇到一个问题,如何将 Presenter 和 View 的生命周期进行绑定,常见的做法是,在 Activity 的生命周期中手动调用 Presenter 的回调方法,更复杂的做法可能需要在 Presenter 或者 View 维护一个操作栈,在指定生命周期中去执行操作。 关于Lifecyclelifecycle 是 Google 推出的用于响应 Activity ...
SparseArray源码解析
关于SparseArraySparseArray 是 Android SDK 提供的将 integers 映射到对象的容器。相对于 HashMap 更节省内存,因为它避免了 key 发生自动装箱,同时不用额外的对象来表示映射关系。 SparseArray 使用二分查找来查询 key,这意味着,key 是有序存储的,而且不适用于大量数据的情况。通常情况下,它的查找比 HashMap 慢。 为了提高性能,SparseArray 在删除 key 时,不会立即调整数据结构,而是将该条目标记为删除,在之后使用相同 key 时可以复用或者垃圾回收操作中进行调整。 垃圾回收操作会发生在需要扩容、获取...
Jetpack中的ViewModel
前言首先祝大家在新的一年中,身体健康,心想事成。 算了下,去年技术类博客写了 15 篇,看下数量还算比较满意,可是基本都是前半年写的,那时候刚刚下定决心要好好写博客,后半年因为工作上还有自己偷懒心理,基本都没怎么写了,真是惭愧。 不过经过去年写了这些文章,慢慢也学习到了一些写技术文章上的技巧,希望今年能方得始终,提升文章的质量。 关于 Jetpack相信已经有不少人对 Google 推出的 Jetpack 系列组件都有所耳闻,现在网上已经有不少的分析文章了,涵盖了用法和源码解析,所以我就不重复造轮子,在这个系列文章中,不会涉及使用教程等,只写一些个人的使用体会,也当作给自己做笔记。 关于...
2018年复盘
2018也到了尾声,这一年感觉经历了较之往年更多的事情,比如有了想守护一辈子的另一半,一年之间换了两次工作,面了很多试。。。算算从毕业工作到现在也有三年多了,一直做着 Android 开发,说起来入门 Android 真的是非常巧合,大学的专业不是软件工程,虽然说跟计算机有点联系,但课程跟软件有点联系的,也就 C 语言,数据库和网络课程等,编程基础的数据结构算法,这些都没有。那时候对编程的认识,也仅限于很模糊的 “很酷的黑客”,大一大二的时候也开始自学数据结构和算法知识,很可惜都没有坚持下去,那时候感觉很枯燥,每次都是信心满满然后又半途而废,学过 c++,c#,还用过 qt,可惜要么是学...
AppPlugin中的Task-第一篇
前言在使用 Android Studio 以后,基本新的 Android 项目都是用 Gradle 作为构建工具,关于 Gradle 的介绍不在本文范畴,当新建一个 Android 项目时,默认只会有个 module 使用com.android.application 插件,Gradle 的核心在于 task,即从 java 源文件和资源文件编译成 apk 文件(编译过程),就是由一系列的 task 组成,task 可以相互依赖,比如最基本的 Task.dependsOn(),所以理解 Android 编译过程就是理解各个 task 的作用。 本文涉及的源码: com.android...
ArrayList源码分析
构造函数ArrayList 的构造函数有三个: ArrayList() ArrayList(int) ArrayList(Collection<? extends E>) 其中用的最多的是无参默认构造函数,ArrayList 底层是使用数组实现的,这里初始化一个空数组 12345public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;} private static final Ob...
HashMap源码分析
构造方法从构造方法来看,我们可以指定初始化容量(initialCapacity)和负载因子(loadFactor),其中 loadFactor 的默认值为 0.75,如果指定了 initialCapacity,就会计算容量阙值(threshold): 123456789101112// tableSizeFor 会计算一个大于或等于 initialCapacity 的 2 的 N 次方的值this.threshold = tableSizeFor(initialCapacity);static final int tableSizeFor(int cap) { ...
JavaScript正则表达式
快速字符 字符 说明 \d 所有数字,相当于 [0-9] \D 非数字,相当于 [^0-9] \s 空白字符,包括空格、制表符、换页符、换行符 \S 非空白字符 \w 单字符(字母、数字或者下划线),相当于 [A-Za-z0-9_] \W 非单字符 使用 {} 表示出现的次数 1/s{2,6}/ // s 字符出现 2 到 6 次,要注意这些情况:ssssssss,这里会当作 ssssss ss,而匹配成功 1/s{2,}/ // s 字符至少出现 2 次以上 1/s {2}...
avatar
leo
Just Do It.