点赞关注,不再迷路,你的支持对我意义重大!
🔥 Hi,我是丑丑。本文 GitHub · Android-NoteBook 已收录,这里有 Android 进阶成长路线笔记 & 博客,欢迎跟着彭丑丑一起成长。(联系方式在 GitHub)
前言
- 最近我负责了一些相册相关的需求,在完成业务的同时,也希望对图片加载的过程有更深入的认识;
- 在这篇文章里,我将从源码上探讨 图片加载 的过程,文章中引用的核心源码我已经进行了简化与梳理,相信能极大减低你的学习成本。如果能帮上忙,请务必点赞加关注,这真的对我非常重要。
相关文章
目录
1 | arduino复制代码public static class Options { |
1 | ini复制代码public Options() { |
现在,我们来看加载图片资源的入口方法:
BitmapFactory.java
1 | csharp复制代码入口方法 1 |
可以看到,两个入口方法的区别在于是否传入Options
,在 第 5 节 我会讲到 通过配置Options
来自定义解码,目前我们先当opts == null
。
简化后的decodeResource(...)
非常清晰,无非是分为两个步骤:
- 1、匹配资源,打开 InputStream
- 2、解码资源,返回 Bitmap
这个步骤主要完成 从资源 id(一个 int 值)定位到具体某一个文件夹下的资源:
ResourcesImpl.java
1 | less复制代码-> 1、匹配资源 id,打开 InputStream |
AssetManager.java
1 | java复制代码-> 1.1.1 |
1 | scss复制代码static jint NativeGetResourceValue(JNIEnv* env, jclass /*clazz*/, jlong ptr, jint resid, |
以上代码已经非常简化了,主要关注以下几点:
- 在 1.1.1 分支,查找资源 id,并将相关信息存储在 outValue,其中比较关键的信息是:将文件夹对应的 densityDpi 保存在 TypeValue 中(这个值在下一节会用到);
- 匹配过程比较冗长,直接看示意图:
引用自 blog.csdn.net/xuaho0907/a… —— 爱吃冰淇淋的羊驼
在上一步匹配资源中,我们已经获得 InputStream & TypedValue(带有文件夹对应的 densityDpi),这一步我们将对图片资源进行解码,decodeResourceStream()
代码如下:
BitmapFactory.java
1 | ini复制代码-> 2、解码资源,返回 Bitmap |
可以看到,在执行decodeStream()
之前有两个比较重要的步骤:
- 2.1 如果未设置 inDensity,则设置为 文件夹对应的 densityDpi
- 2.2 如果未设置 inTargetDensity,则设置为 设备的 densityDpi
到了【2.3 执行解码】,根据是否为 AssetInputStream,调用不同的 native 方法:
- 2.3.1 AssetManager 输入流
(例如:/asset、/raw、/drawable)
,调用nativeDecodeAsset()
- 2.3.2 其他输入流
(例如 FileInputStream)
,调用nativeDecodeStream()
1 | scss复制代码-> 2.3.1 AssetManager 输入流 |
最终都走到doDecode()
,这段代码是图片解码的核心逻辑:
1 | ini复制代码已简化 |
提示: 整段源码非常长,阅读的过程是比较痛苦。好处是最终通过源码也发现了不少错误 / 片面的认识,也是收获颇丰。贴心的我当然都帮你整理好了,如果能帮上忙,请务必点赞加关注 ,这真的对我非常重要。
参考资料
- 《Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存?》 —— 霍丙乾 著
- 《Android 开发高手课·内存优化(上/下)》 —— 张绍文 讲,极客时间 出品
- 《Android内存优化杂谈》 —— 张绍文 著
推荐阅读
- 密码学 | Base64是加密算法吗?
- 操作系统 | 中断 & 系统调用浅析
- 算法面试题 | 回溯算法解题框架
- 算法面试题 | 链表问题总结
- 计算机网络 | 图解 DNS & HTTPDNS 原理
- 逻辑 | “我知道你不知道”!精选十道逻辑类面试题(一)
- Android | 说说从 android:text 到 TextView 的过程
- Android | 食之无味!App Startup 可能比你想象中要简单
- Android | 适可而止!看Glide如何把生命周期安排得明明白白
创作不易,你的「三连」是丑丑最大的动力,我们下次见!
本文转载自: 掘金