Android艺术——Bitmap高效加载和缓存(1)
通过Bitmap我们可以设计一个ImageLoader,实现应该具有的功能是:
图片的同步加载;图片的异步加载;图片的压缩;内存缓存;磁盘缓存;网络获取;
1.加载
首先提到加载:BitmapFactory类提供了四类方法:decodeFile、decodeResource、decodeStream和decideByteArray。分别是文件系统、资源、输入流和字节数加载Bitmap对象。
2.压缩
如何进行图片的压缩?首先我们为什么图片压缩呢?因为很多时候ImageView尺寸小于图片原始尺寸,没必要把原始图片全部加载到内存,可能造成oom,并且ImageView也没办法全部显示原始图片,采样压缩将缩小后的图片在ImageView中显示,同时降低图片内存占用从而避免oom,提高Bitmap加载性能。图片内存太大会影响用户的体验,而且对设备存储也是浪费了资源。怎么压缩?通过BitmapFactory.Options来缩放图片,主要是inSampleSize参数,叫采样率。inSampleSize=1就是和原图一样,inSampleSize=4,加载后的图片长和宽是原图片长和宽的1/4,像素数是原图片的1/16,加载后占用的内存也是原图片占用内存的1/16.
其中步骤是:
(1)BitmapFactory.Options的inJustDecodeBound参数设为true并加载图片;
(2)从BitmapFactory.Options中取出图片原始宽高信息,对应outWidth和outHeight
(3)结合目标view(imageView)所需图片大小,计算采样率;
(4)将BitmapFactory.Options的inJustDecodeBounds置为false,重新加载。
3.缓存
其中内存缓存与磁盘缓存是最为核心的,缓存就是为了移动端服务的,例如:有一大批的网络图片,需要下载后才能在用户界面上显示,如果是在PC端可以直接下载到本地进行显示,但是在移动端我们都是需要大量的流量进行下载,为了解决流量消耗的问题,缓存就是我们的不二之选,有了缓存我们从网络第一次网络加载之后,图片缓存在我们的设备之中,当我们再次查询图片的时候,就不用再次从网络上获取,而是先从设备的缓存上进行获取,如果没有,再考虑从网络上获取,这就是缓存策略。
目前我们常用的缓存算法是LRU算法,就是近期最少使用算法,核心就是如果缓存存满时候,有优先淘汰那些近期最少使用的缓存对象。说到LRU其中的两种缓存:LruCahe与DisKLruCahe,前者是用于实现内存缓存,后者则是充当了储存设备的缓存。
这次我介绍了Bitmap 的加载与缓存,下次我们进一步的分析具体代码。
Android艺术——Bitmap高效加载和缓存(1)的更多相关文章
- Android艺术——Bitmap高效加载和缓存代码分析(2)
Bitmap的加载与缓存代码分析: 图片的压缩 比如有一张1024*768像素的图像要被载入内存,然而最终你要用到的图片大小其实只有128*96,那么我们会浪费很大一部分内存,这显然是没有必要的,下面 ...
- Android之Bitmap 高效加载
一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数 图片格式(Bitmap.Config) 一张100*100的图片占用内存的大小 ALPHA_8 图片长度*图片宽度 100 ...
- Android开发之高效加载Bitmap
一.概述 在Android开发中,我们经常与Bitmap打交道,而对Bitmap的不恰当的操作经常会导致OOM(Out of Memory).这篇文章我们会介绍如何高效地在Android开发中使用Bi ...
- Bitmap的加载与缓存
Android系统中图片一般用Bitmap对象表示,它支持png,jpg等常见格式.通常情况下图片的体积都比较大,单个应用允许使用的内存又是有限的,所以我们需要采取一些手段减少内存占用并提高加载速度. ...
- Android开发艺术探索》读书笔记 (12) 第12章 Bitmap的加载和Cache
第12章 Bitmap的加载和Cache 12.1 Bitmap的高速加载 (1)Bitmap是如何加载的?BitmapFactory类提供了四类方法:decodeFile.decodeResourc ...
- Android高效加载大图、多图解决方案,有效避免程序OOM
高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是 ...
- Android高效加载大图、多图解决方案,有效避免程序OOM(转)
本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/training/displaying ...
- [翻译]Bitmap的异步加载和缓存
内容概述 [翻译]开发文档:android Bitmap的高效使用 本文内容来自开发文档"Traning > Displaying Bitmaps Efficiently", ...
- Android高效加载大图、多图解决方案,有效避免程序内存溢出现象
好久没有写博客了,今天就先写一个小的关于在Android中加载大图如何避免内存溢出的问题. 后面会写如何使用缓存技术的核心类,android.support.v4.util.LruCache来加载图片 ...
随机推荐
- "PECS原则"几篇好文章
<? extends T>和<? super T>Java 泛型中的PECS原则(copy源码样例)
- C++系列总结——mutable关键字
介绍 mutable的中文意思是易变的,是C++的一个关键字.它的作用就是允许修改被const修饰的对象的成员变量. 常用场景 什么情况下我们会使用到mutable? 一般我们会用const修饰get ...
- C++系列总结——构造与析构
前言 在使用资源前,我们需要做一些准备工作保证资源能正常使用,在使用完资源后,我们需要做一些扫尾工作保证资源没有泄露,这就是构造与析构了,这和编程语言是无关的,而是使用资源的一种方式.C++只不过是把 ...
- 【代码笔记】Web-CSS-CSS Float(浮动)
一, 效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 前端入门16-JavaScript进阶之EC和VO
声明 本系列文章内容全部梳理自以下几个来源: <JavaScript权威指南> MDN web docs Github:smyhvae/web Github:goddyZhao/Trans ...
- Xshell工具使用--连接VMware虚拟机
假设有这样的场景,开发者用的是Windows系统,且系统的存储资源和内存有限,在运行VMware虚拟机中做一些测试时,通常会碍于电脑的VMWare客户端图形界面的响应速度太慢.而在Xshell中对虚拟 ...
- 2019Java查漏补缺(三)
1.为什么这个public的类的类名必须和文件名相同 是为了方便虚拟机在相应的路径中找到相应的类所对应的字节码文件 2.java8 的一些新特性: 3: 数据库隔离级别 隔离级别 ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
- [spring boot] Table 'yhm.hibernate_sequence' doesn't exist
在使用该注解时:@GeneratedValue要注意的几点: @GeneratedValue注解的strategy属性提供四种值: -AUTO主键由程序控制, 是默认选项 ,不设置就是这个 -IDEN ...
- mas录屏,带系统声音和麦克风声音
自带的QuickTime + Soundflower 可完美解决,同时录系统的声音和mic声音,也可以只录系统声音. 安装Soundflower 在应用程序 -> 实用工具,里面找到“音频 MI ...