- 博客(226)
- 资源 (7)
- 收藏
- 关注

原创 Glide系列(四) — Glide缓存流程分析
Glide 是一个图片加载库,跟它同类型的库还有 Picasso、Fresco、Universal-Image-Loader 等。基于 Glide 优秀的缓存管理策略和生命周期关联的特点,目前市面上对 Glide 的使用非常广,因此我们有必要深入研究下 Glide 相关的实现原理,便于更好的使用它。
2022-10-31 16:05:23
1676

原创 DiskLruCache 源码分析
我们知道 Glide 图片框架的内存缓存用的是 LruCache,磁盘缓存是 DiskLruCache,它们用的都是LRU算法。内存缓存的 LRU 还比较好理解,那么文件是如何按照 LRU 的思想进行管理的呢?本文将以 Glide 框架内的 DiskLruCache 代码来分析它的实现方式。
2022-10-27 23:08:03
815

原创 Glide系列(一) — Glide 框架结构浅析
Glide 是一个图片加载库,跟它同类型的库还有 Picasso、Fresco、Universal-Image-Loader 等。Glide 框架的优点如下:1. 加载类型多样化:Glide 支持 Gif、WebP 等格式的图片。2. 生命周期的绑定:图片请求与页面生命周期绑定,避免内存泄漏。3. 高效的缓存策略: 1. 支持多种缓存策略 (Memory 和 Disk 图片缓存)。 2. 根据 ImageView 的大小来加载相应大小的图片尺寸。 3. 内存开销小。
2020-06-08 11:00:22
20688
1

原创 Executor框架(一) — 浅析 Executor 框架设计
本文介绍来 JDK中 Executor 框架,分析来框架的调度模型、类图之间的关系。
2016-10-19 21:28:03
506
原创 NDK(四):Native与Java互调
JNI(全名Java Native Interface)Java native接口,它可以让一个运行在Java虚拟机中的Java代码被调用或者调用native层的代码。简单理解为就是一个连接Java层和Native层的桥梁。
2023-03-24 17:12:54
736
1
原创 源码分析 — Sytem.loadLibrary 解析
在我们实际开发中,经常会调用so库的一些功能,那么他们是如何工作的呢?本文我们就来分析一下 so库的加载原理。
2023-03-24 14:55:19
3054
1
原创 NDK(五):JNI静态注册与动态注册
我们知道,JNI是Java层与Native层的桥梁,可以通过 JNI层实现Java层与Native层的互调。那么JNI是如何将 Java方法与 Native方法关联起来的呢?
2023-03-23 22:06:04
1921
原创 NDK(二):JNI 的数据结构
JNI(全名Java Native Interface)Java native接口,其可以让一个运行在Java虚拟机中的Java代码被调用或者调用native层的用C/C++编写的基于本机硬件和操作系统的程序。简单理解为就是一个连接Java层和Native层的桥梁。开发者可以在native层通过JNI调用到Java层的代码,也可以在Java层声明native方法的调用入口。
2023-03-23 20:42:34
652
原创 NDK(三):JNIEnv解析
JNIEnv(Java Native Interface Environment) 是一个JNI接口指针 (每个线程独有一个 JNIEnv 指针),指向了本地方法的一个函数表,该函数表中的每一个成员指向了一个JNI函数,本地的方法通过JNI函数来访问JVM中的数据结构。
2023-03-23 20:26:39
1477
原创 Flutter渲染机制(二):Element
在Flutter渲染机制(一):Widget 树一文中,我们介绍了 Widget 树,发现每一种类型的 Widget 都会创建与之相对应的 Element,那这个 Element 又是什么,有什么作用呢?Element 是 Widget 的实际内容,并且会根据 Widget 的位置,配置自己在书中的位置。Element 会形成一棵树,有的 Element 有一个子节点,有的有多个子节点。
2023-03-20 15:21:09
503
原创 Flutter渲染机制(一):Widget
Widget 是我们构建页面UI的基本元素,如设置间距用的Padding、行排列用的Row、流式布局用的 Wrap。Widget内的所有属性都是 final 类型,它是一个配置文件,是 Element 的描述性信息。Widget 的作用类似于 Android Native 开发中的 xml 角色。
2023-03-19 23:06:36
467
原创 网络基础(四) — QUIC协议
QUIC(Quick UDP Internet Connections)协议是一种全新的基于 UDP 的 web 开发协议(应用层协议)。本文主要来分一下 QUIC 协议相对于 TCP 协议的优势。
2023-03-17 15:08:21
1142
原创 渲染机制(四):硬件加速
硬件加速的主要原理是通过将CPU不擅长的图形计算转换成GPU专用指令,让更擅长图形计算的GPU来完成渲染,从而提升了整体的渲染速度。
2023-03-16 22:25:07
950
原创 渲染机制(二):Choreographer 源码解析
在引入 Vsync 之前,系统渲染一帧是通过Message来实现的,Msg中间没有间隔。但由于Msg的消费时长不确定,这直接导致了帧率不稳定,从而产生了Jank现象,画面撕裂等问题。为了优化这些问题,Android 在4.1之后引入了 `Choreographer + SurfaceFlinger + Vsync + TripleBuffer` 这一套机制,保证了 Android App 可以以一个稳定的帧率运行(60fps),减少帧率波动带来的不适感。
2023-03-14 22:15:39
1569
原创 渲染机制(一):Android渲染机制的演进
在Android中,当我们谈到布局优化、卡顿优化时,通常通过减少布局层级、减少主线程耗时操作来减少丢帧。如果丢帧比较严重,那么界面可能会有明显的卡顿感。本文我们来探究下Android的渲染机制。
2023-03-13 19:16:01
1333
1
原创 算法:动态规划
动态规划(英语:Dynamic programming,简称 DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,并且记录所有子问题的结果,因此动态规划方法所耗时间往往远少于朴素解法。动态规划有自底向上和自顶向下两种解决问题的方式。自顶向下即记忆化递归,自底向上就是递推。
2023-03-07 00:11:30
325
原创 算法:链表
链表(Linked List)是最简单的线性的、动态数据结构。理解它是理解树结构、图结构的基础。链表在插入数据的时候可以达到 O(1) 的复杂度,但是查找一个节点或者访问特定编号的节点则需要 O(n) 的时间。
2023-03-02 22:04:18
792
原创 算法:二分法查找
二分查找算法 ,是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
2023-03-02 14:26:05
112
原创 算法:LRU算法
LRU算法的特点是:当资源不足需要清除数据时,最近被使用过的数据不会被清除(即:只会清除最近没有使用的数据)。要实现这个特点,就需要维护一个链表来表达数据被使用的顺序。同时我们知道链表的查询效率较低,所以需要结合散列表的特点(查询效率高)来实现这个数据结构。
2023-02-27 14:32:10
132
原创 Glide系列(五) — Request 构建流程分析
Glide 是一个图片加载库,跟它同类型的库还有 Picasso、Fresco、Universal-Image-Loader 等。基于 Glide 优秀的缓存管理策略和生命周期关联的特点,目前市面上对 Glide 的使用非常广,因此我们有必要深入研究下 Glide 相关的实现原理,便于更好的使用它。
2022-11-11 11:13:17
561
原创 Glide系列(三) — LoadProvider、ModelLoader、DataFetcher和ResourceTranscoder关系
Glide 是一个图片加载库,跟它同类型的库还有 Picasso、Fresco、Universal-Image-Loader 等。基于 Glide 优秀的缓存管理策略和生命周期关联的特点,目前市面上对 Glide 的使用非常广,因此我们有必要深入研究下 Glide 相关的实现原理,便于更好的使用它。
2022-10-30 15:59:45
961
2
原创 RecyclerView(一) — 绘制流程分析
RecyclerView继承自ViewGroup,其最根本的功能是添加子View。当子View过多时,超出屏幕部分的子 View 就显示不出来,这时引入滑动机制来解决问题。当子 View 数量很多时,又会产生另一个新问题 (内存占用大)。这种场景有个特点,即屏幕展示的子 View 有限,大部分子 View 都不可见。所以新增View的复用机制,通过回收并复用不可见的View 来实现优化。这便是 ListView、RecyclerView存在的价值。本文主要分析RecyclerView的实现方案。
2022-10-26 16:27:49
1300
原创 并发容器(五) — ConcurrentHashMap 源码分析(JDK1.8)
在高并发下 HashMap是线程不安全的,主要原因是在同一个桶中并发操作会带来问题,为此我们只需要解决并发操作同一个桶的安全性问题即可,因此在SDK提供的ConcurrentHashMap类中通过分段锁(JDK1.7)或CAS+Sync(JDK1.8)来保证操作的安全性。
2022-10-25 13:32:56
467
原创 并发容器(五) — ConcurrentHashMap 源码分析(JDK1.7)
我们知道,在高并发下 HashMap是线程不安全的,主要原因是在同一个桶中并发操作会带来问题。为此我们只需要解决并发操作同一个桶的安全性问题即可,因此在SDK提供的ConcurrentHashMap类中通过分段锁(JDK1.7)或CAS+Sync(JDK1.8)来保证操作的安全性。
2022-10-24 22:32:58
866
原创 HashMap(三) — HashMap 高并发场景下的问题分析
高并发下的HashMap我们知道不管是哪个版本的HashMap都是线程不安全的。本文主要分析JDK1.7 中HashMap环状链表的形成过程。
2022-10-24 11:34:19
1656
原创 Android 虚拟机 (Dalvik & ART)
我们知道Android的程序虽然也是使用Java/Kotlin语言编码,并生成.class字节码,但并不能运行在JVM上,而是运行在自己的VM上。而Android程序之所以不能在JVM上运行的根本原因是.class字节码文件并不是Android的最终可执行文件,而是一个过渡产物,最终会生成dex文件在Android VM上执行。Dalvik 虚拟机和 ART 虚拟机。
2022-10-22 13:52:21
4981
原创 JVM(二) — 字节码指令
Java虚拟机是基于操作数栈而非寄存器的架构,其操作指令由`操作码`和`操作数(0或多个操作数)`组成。- 操作码:操作码的长度为一个字节(0~255),因此操作码总数不能超过256条。- 操作数:一条指令可以有零或者多个操作数,且操作数可以是1个或者多个字节。...
2022-05-26 16:29:20
609
Two Scoops of Django 1.11- 2017(Daniel Greenfeld).pdf
2017-09-10
graphviz-2.37
2016-11-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人