| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Connor学Android - Bitmap的加载和缓存策略 -> 正文阅读 |
|
[移动开发]Connor学Android - Bitmap的加载和缓存策略 |
前言Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习、复盘过程,欢迎各位大佬阅读斧正!原创不易,转载请注明出处:http://t.csdn.cn/n6ljR,话不多说我们马上开始! 1.Bitmap 的高效加载1.1 Bitmap 的加载(1)Bitmap 在 Android 中指的是一张图片,可以是 png 格式也可以是 jpg 等其他常见的图片格式 (2)Bitmap 的加载可以通过 BitmapFactory 完成,这个类提供了四类方法
(3)BitmapFactory 中的这四类方法最终是在 Android 的底层实现的,对应 BitmapFactory 类的几个 native 方法 1.2 Bitmap 的高效加载(1)由于 Bitmap 的特殊性以及 Android 对应用的内存限制(16MB),导致加载 Bitmap 时很容易出现 OOM,因此需要更高效地加载 (2)Bitmap 高效加载的核心思想就是采用 BitmapFactory.Options 按一定的采样率来加载缩小后的图片,将缩小后的图片显示在页面上,这样就可以通过降低图片的内存占用,从而一定程度上避免了 OOM (3)BitmapFactory 提供的四类方法都支持 BitmapFactory.Options 参数,通过它们就可以很方便地对一个图片进行采样缩放 (4)BitmapFactory.Options 缩放图片主要用到了它的 inSampleSize 参数,即采样率
(5)通过采样率即可有效地加载图片,那应如何获取采样率呢?过程如下
2.Android 中的缓存策略2.1 基本介绍缓存 Android 的缓存可用于避免过多的流量消耗,一般设计为三级的缓存机制 (1)当程序第一次从网络加载图片后,就将其缓存到存储设备上,这样下次使用这张图片就不需要再从网上获取了 (2)很多时候还会在内存中再缓存一份 (3)这样当应用要请求一张图片时,会首先从内存中获取,如果没有再从存储设备中获取,如果还没有就从网络上下载 缓存策略 (1)缓存策略主要包含缓存的添加、获取和删除,当缓存容量满了,则需要删除一些旧缓存来添加新缓存 (2)如何定义缓存的新旧就是一种缓存的策略,不同的策略对应不同的缓存算法 (3)常用的缓存算法是 LRU,最近最少使用算法,即优先淘汰最近最少使用的缓存对象,采用该算法的缓存主要有两种
2.2 LruCache(1)LruCache 是一个泛型类,内部采用一个 LinkedHashMap 以强引用的方式存储外界的缓存对象
(2)创建LruCache时只需要提供缓存的总容量大小并重写 sizeOf 方法即可
(3)通过 get、set 方法完成缓存的获取和添加操作 (4)还支持删除操作,可通过 remove 方法删除一个指定的缓存对象 (5)当缓存满时,会移除较早使用的缓存对象,然后再添加新的缓存对象 2.3 DiskLruCacheDiskLruCache 用于实现存储设备缓存,即磁盘缓存,通过将缓存对象写入到文件系统中实现缓存效果 创建 DiskLruCache 不能通过构造方法来创建,需要通过 open 方法来完成,open 方法共有四个参数 (1)第一个参数表示磁盘缓存在文件系统中的存储路径,可以选择 SD 卡上的缓存目录,也可以选择 SD 卡上的其他指定目录
(2)第二个参数表示应用的版本号,一般设为1即可。当版本号发生改变时会清空之前所有的缓存文件,但在实际开发中并非那么有效 (3)第三个参数表示单个节点所对应的数据的个数,一般设为1即可 (4)第四个参数表示缓存的总大小,单位是 B,超出这个值时会清楚一些缓存来保证总大小不大于这个设定值
添加 缓存添加的操作是通过 Editor 完成的,Editor 表示一个缓存对象的编辑对象,添加步骤如下 (1)首先需要获取图片 url 对应的 key
(2)根据 key 通过 edit 方法获取 Editor 对象,获取到后即可根据它来得到一个文件输出流
(3)当我们从网络下载图片时,就可以通过拿到的文件输出流写入到文件系统上了
(4)此时还没有真正地将图片写入文件系统,还必须调用 Editor 的 commit 方法来提交写入操作,如果图片下载过程中发生了异常,还可以通过 Editor 的 abort 方法来回退整个操作
查找 和缓存的添加过程类似 (1)将 url 转换为 key (2)根绝 key 调用 DiskLruCache 的 get 方法获取一个 Snapshot 对象 (3)根据 Snapshot 对象即可得到缓存的文件输入流,进而得到 Bitmap 对象 (4)一般不建议直接加载原始图片,而是加载缩放图片
删除 可通过 remove、delete 方法完成对磁盘缓存的删除操作 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 4:24:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |