![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android
文章平均质量分 95
彭旭锐
掘金签约作者,头条 / 简书优秀作者。这里有 Android 进阶成长路线笔记 & 博客,有志同道合的朋友,加入交流群一起成长。
展开
-
一进群就水群?试试这个水群拦截工具
我们希望营造 work-life balance 的技术学习氛围,让志同道合,热爱技术的小伙伴可以聚起来聊技术,聊生活,聊程序员的一切,但期待有所平衡。我发现有些小伙伴开始是带着问题进群的,结果聊着聊着就忘记手头的事情了,整一个被带偏好吧。但是水多了也不好,说多了没有技术性会让大家的获得感降低,那就没意思了。你可以畅所欲言,自由发挥,可以聊生活,聊感情,聊你现在的心情。最近交流群人数越来越多,群里的小伙伴还个个都是人才,说话又好听,每天打开微信看都是满屏的。周末了,可以休息了,来自习室休息吧。原创 2023-03-06 00:10:00 · 263 阅读 · 0 评论 -
Android 内存缓存框架 LruCache 的实现原理,手写试试?
大家好,我是小彭。在之前的文章里,我们聊到了 LRU 缓存淘汰算法,并且分析 Java 标准库中支持 LUR 算法的数据结构 LinkedHashMap。当时,我们使用 LinkedHashMap 实现了简单的 LRU Demo。今天,我们来分析一个 LRU 的应用案例 —— Android 标准库的 LruCache 内存缓存。小彭的 Android 交流群 02 群已经建立啦,扫描文末二维码进入~思维导图:在具体分析 LruCache 的源码之前,我们先回顾上一篇文章中讨论的 LRU 缓存策略以及 Li原创 2022-12-03 16:55:05 · 283 阅读 · 0 评论 -
为什么计算机中的负数要用补码表示?
大家好,我是小彭。在前面的文章里,我们聊到了计算机的冯·诺依曼架构的 3 个基本原则。其中第 1 个原则是计算机中所有信息都是采用二进制格式的编码。也就是说,在计算机中程序的数据和指令,以及用户输入的所有数据,计算机都需要把它们转换为二进制的格式,才能进行识别和运算。然而,我们日常生活接触到的大部分数字却是十进制编码,例如手机号码、工牌号、学号。那为什么计算机要使用二进制数制?二进制数据如何进行运算,以及计算机做了哪些优化来如何提高运算的效率?今天我们就围绕这些问题展开。原创 2022-12-01 21:13:47 · 1665 阅读 · 2 评论 -
如何使用 LinkedHashMap 实现 LRU 缓存?
缓存是提高数据读取性能的通用技术,在硬件和软件设计中被广泛使用,例如CPU 缓存、Glide 内存缓存,数据库缓存等。由于缓存空间不可能无限大,当缓存容量占满时,就需要利用某种策略将部分数据换出缓存,这就是缓存的替换策略 / 淘汰问题。使用一个随机数生成器随机地选择要被淘汰的数据块;记录各个数据块的访问时间,最早访问的数据最先被淘汰;记录各个数据块的访问“时间戳”,最近最久未使用的数据最先被淘汰。原创 2022-12-01 00:17:51 · 94 阅读 · 0 评论 -
万字 HashMap 详解,基础(优雅)永不过时
大家好,我是小彭。在上一篇文章里,我们聊到了散列表的整体设计思想,在后续几篇文章里,我们将以 Java 语言为例,分析标准库中实现的散列表实现,包括 HashMap、、和 ConcurrentHashMap。今天,我们来讨论 Java 标准库中非常典型的散列表结构,也是 “面试八股文” 的标准题库之一 —— HashMap。本文源码基于 Java 8 HashMap,并关联分析部分 Java 7 HashMap。小彭的 Android 交流群 02 群已经建立啦,扫描文末二维码进入~原创 2022-11-26 15:47:36 · 722 阅读 · 0 评论 -
Android 序列化框架 Gson 原理分析,可以优化吗?
大家好,我是小彭。Gson是 Google 推出的 Java Json 解析库,具有接入成本低、使用便捷、功能扩展性良好等优点,想必大家都很熟悉了。在这篇文章里,我们将讨论 Gson 的基本用法和以及主要流程的源码分析。小彭的 Android 交流群 02 群已经建立啦,扫描文末二维码进入~和是 Gson 1.x 版本提供的自定义解析 API,是基于树型结构的解析 API。在解析数据时,它们会将 Json 数据一次性解析为树型结构。描述JsonObject{} 对象JsonArray[] 数组。原创 2022-11-25 16:11:07 · 928 阅读 · 0 评论 -
如何实现一个优秀的 HashTable 散列表?
在前几篇文章里,我们聊到了 Java 中的几种线性表结构,包括 ArrayList、LinkedList、ArrayDeque 等。今天,我们来讨论另一种常用的基础数据结构,同时也是 “面试八股文” 的标准题库之一 —— 散列表(Hash Table)。同时,在后续的文章里,我们将以 Java 语言为例,分析标准库中实现的散列表实现,包括HashMap和 ConcurrentHashMap。请关注。原创 2022-11-25 15:03:11 · 436 阅读 · 0 评论 -
为什么最近每份 Android 简历都说 “熟悉 MQTT 协议”?
MQTT 是一种基于发布 - 订阅模型的消息传递协议,在物联网和移动应用有较广泛的应用。如果你的目标是冲击中高级工程师岗位,MQTT 或许是一个不错的亮点。最近,我还发现很多候选人会在简历中写自己 “熟悉 MQTT 协议”,但多数人只是停留在了解或用过的程度。这篇文章里,我将与你探讨 MQTT 协议的工作原理 & 协议消息格式 & 核心特性,实战的部分我们会在下篇文章中讨论。原创 2022-09-09 15:36:04 · 893 阅读 · 0 评论 -
ViewBinding 与 Kotlin 委托双剑合璧
ViewBinding 是 Android Gradle Plugin 3.6 中新增的特性,用于更加轻量地实现视图绑定(即视图与变量的绑定),可以理解为轻量版本的 DataBinding。在这篇文章里,我将总结 ViewBinding 使用方法 & 原理,示例程序有用请记得给 Star ,给小彭一点创作的动力。Kotlin | 委托机制 & 原理 & 应用。原创 2022-09-08 14:41:25 · 1397 阅读 · 0 评论 -
舞会上有多少顶黑帽?
大家好,我是小彭。在计算机面试中,逻辑类题目是规模以上互联网公司的必考题。由于题目花样百出,准备难度较大,题海战术可能不是推荐的做法。在这个系列里,我将精选十道非常经典的逻辑题,希望能帮助你找到解题思路 / 技巧。我知道你不知道,我到底知不知道至少要几个砝码,可以称出 1g ~ 40g 重量舞会上有多少顶黑帽?25 匹马 5 条赛道,最快需要几轮求出前 3 名?...原创 2022-09-01 14:22:10 · 166 阅读 · 0 评论 -
美团组件化事件总线方案改进:ModularEventBus
2 年前,我们收集过各大厂的组件化方案。其中,有美团收银团队分享的组件化总线框架 modular-event 让我们印象深刻。在学习和借鉴美团方案中很多优秀的设计思想后,我亦发现方案中依然不足。...原创 2022-08-30 18:01:49 · 391 阅读 · 0 评论 -
图片系列(6)不同版本上 Bitmap 内存分配与回收原理对比
Bitmap 是 Android 应用的内存占用大户,是最容易造成 OOM 的场景。为此,Google 也在不断尝试优化 Bitmap 的内存分配和回收策略,涉及:Java 堆、Native 堆、硬件等多种分配方案,未来会不会有新的方案呢?深入理解 Bitmap 的内存模型是有效开展图片内存优化的基础,在这篇文章里,我将深入 Android 6.0 和 Android 8.0 系统源码,为你总结出不同系统版本上的 Bitmap 运行时内存模型,以及 Bitmap 使用的 Native 内存回收兜底策略。..原创 2022-08-14 01:01:22 · 890 阅读 · 0 评论 -
JVM 系列(6)吊打面试官:为什么 finalize() 方法只会执行一次?
Java Finalizer 机制提供了一个在对象被回收之前释放占用资源的时机,但是都说 Finalizer 机制是不稳定且危险的,不推荐使用,这是为什么呢?今天我们来深入理解这个问题。原创 2022-08-11 18:00:13 · 664 阅读 · 0 评论 -
JVM 系列(5)吊打面试官:说一下 Java 的四种引用类型
Java Reference 类型是与虚拟机垃圾回收机制密切相关的知识点,同时也是面试重要考点之一。一般认为 Java 有四种 Reference(强引用 & 软引用 & 弱引用 & 虚引用),但是其实还有隐藏的第五种 Reference,你知道是什么吗?...原创 2022-08-11 17:15:12 · 765 阅读 · 0 评论 -
NDK 系列(5):JNI 从入门到实践,爆肝万字详解!
NI是实现Java代码与C/C++代码交互的特性,思考一个问题——Java虚拟机是如何实现两种毫不相干的语言的交互的呢?今天,我们来全面总结JNI开发知识框架,为NDK开发打下基础。原创 2022-07-28 16:49:27 · 974 阅读 · 0 评论 -
NDK 系列(6):说一下注册 JNI 函数的方式和时机
在上一篇文章中,我们提到了注册 JNI 函数(建立 Java native 方法和 JNI 函数的映射关系)有两种方式:静态注册和动态注册。今天我们来详细说下这 2 种注册方式的使用方法和实现原理。原创 2022-07-27 20:48:44 · 453 阅读 · 0 评论 -
Android 面试题:你说一下 PendingIntent 和 Intent 的区别?
从字面意思上理解,PendingIntent是一种延迟的Intent,表示一种延迟执行的意图操作。对,但又不完全对。一句话概括,PendingIntent一种是支持授权其他应用以当前应用的身份执行包装的Intent操作的系统特性。在这篇文章里,我将带你理解PendingIntent的使用方法、设计理念以及核心源码分析,相信阅读完这篇文章后你对PendingIntent的理解将超过绝大部分同学。...原创 2022-07-21 23:43:53 · 513 阅读 · 0 评论 -
为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列
ViewModel 是 Jetpack 组件中较常用的组件之一,也是实现 MVVM 模式或 MVI 模式的标准组件之一。原创 2022-07-19 17:02:26 · 762 阅读 · 0 评论 -
LiveData 还有学习的必要吗?—— Jetpack 系列(2)
虽然 LiveData 不再是主推的组件,但考虑到 LiveData 依然存在于大量存量代码中,以及 LiveData 伴随着 Android 生态发展过程中衍生的问题和解决方案,还存在一定的学习价值原创 2022-07-18 16:30:46 · 798 阅读 · 0 评论 -
Lifecycle:生命周期感知型组件的基础 —— Jetpack 系列(1)
生命周期是 Activity 的核心特性之一,也是 Android 视图开发无法规避的重要问题。为了更加健壮地处理生命周期问题,Google 的解决方案是将生命周期定义为一套标准的行为模式,即 Lifecycle 框架。这种方式不仅简化了在 Activity / Fragment 等生命周期宿主中分发生命周期事件的复杂度,还提供了自定义生命周期宿主的标准模板。...原创 2022-07-15 16:03:43 · 363 阅读 · 0 评论 -
其实 Gradle Transform 就是个纸老虎 —— Gradle 系列(4)
目前,使用 AGP Transform API 进行字节码插桩已经非常普遍了,例如 Booster、神策等框架中都有 Transform 的影子。Transform 听起来很高大上,其本质就是一个 Gradle Task。原创 2022-05-18 13:50:40 · 583 阅读 · 0 评论 -
手把手带你自定义 Gradle 插件 —— Gradle 系列(2)
Gradle 本质上是高度模块化的构建逻辑,便于重用并与他人分享。例如,我们熟悉的 Android 构建流程就是由 Android Gradle Plugin 引入的构建逻辑。在这篇文章里,我将带你探讨 Gradle 插件的使用方法、开发步骤和技巧总结。原创 2022-05-17 15:30:46 · 1097 阅读 · 1 评论