BitmapUtils加载机制

BitmapUtils加载bitmap流程

BitmapUtils主要解决Android加载图片出现的OOM现象,采取了多级缓存机制(内存缓存和磁盘缓存)保存图片避免OOM现象,采取异步加载bitmap,在listView快速滑动时停止加载。

1.   BitmapUtils接口支持AssetsUrlPath的图片路径。

BitmapGlobalConfig主要配置磁盘缓存路径,程序内存缓存大小。(不设置有默认值),直接在bitmapUtils初始化时设置。

BitmapDisplayConfig主要配置异步加载未完成时临时显示的图片,加载失败显示的图片,加载过程中的动画,图片是否翻转,是否显示原图以及显示图片的最大Size等。

2.   为何出现OOMbitmaputils如何规避OOM

出现OOM的原因主要有:加载对象过大,加载资源过多,内存没来得及释放,导致系统内存不足。

BitmapUtils主要采取两种方式加载图片避免OOM。

(1)内存缓存(LruCache)。主要采取LinkedHashMap< MemoryCacheKey, Bitmap >存储bitmap到缓存中,默认系统缓存为4M,当内存超出4M,移除上一元素的缓存。

(2)采取decodeFileDescriptor与BitmapFactory.Options结合动态分配bitmap内存。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inTempStorage = new byte[12 * 1024];
options.inSampleSize = 1;
bitmap = BitmapFactory.decodeFileDescriptor(ins.getFD(), null, options);

用BitmapFactory解码一张图片时,会遇到OOM现象。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。以下两个参数只需要设置一个即可实现动态分配bitmap内存。

inTempStorage设置图片资源临时空间。

inSampleSize设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除OOM。

3.  BitmapUtils加载Bitmap策略

(1)首先加载内存缓存bitmap。

(2)在内存缓存获取不到的情况下,加载文件缓存的文件输入流,把文件输入流转化为bitmap,同时存储到内存缓存中,并且回收当前的bitmap。

(3)直接加载路径下的资源(Assets、Path、URL)处理都一样,都是获取文件输入流。通过BitmapFactory.decodeFileDescriptor,把文件输入流转化为bitmap,同时保存文件输入map。

时间: 2024-12-16 19:40:57

BitmapUtils加载机制的相关文章

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

Yii2的深入学习--自动加载机制

Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个 vendor/autoload.php 文件.你可以简单的引入这个文件,你会得到一个自动加载的支持. 在之前的文章,入口文件的介绍中,我们可以看到如下内容: // 引入 vendor 中的 autoload.php 文件,会基于 composer 的机制自动加载类 require(__DIR__ .

Python模块动态加载机制

本文和大家分享的主要是python中模块动态加载机制相关内容,一起来看看吧,希望对大家学习python有所帮助. import 指令 来看看 import sys 所产生的指令: co_consts : (0, None) co_names : ('sys',) 0 LOAD_CONST               0 (0) 2 LOAD_CONST               1 (None) 4 IMPORT_NAME              0 (sys) 6 STORE_NAME  

20150112--抽象类+接口+重载+自动加载机制-02

重载 重载:overload,被重新加载.在面向对象里,重载指的当一个函数(方法),具有不同的返回值或者参数列表的时候,可以有不同的存在形式(允许同名函数存在:返回值或者参数列表不一样) class Person{ public string function eat(){//吃饭方法;return '吃饱了';} public string function eat(水果){//吃水果;return '好吃';} public string function eat(主食){//吃主食;ret

java动态加载机制

假设有一个class,ClassLoader首先把它load到内存里的code segment(内存里存放代码段的),站在ClassLoader的角度,内存里的一个一个的class就是一个一个的对象,这个对象就是xx.class,实际就是Class类的对象.Load完class,找到main函数开始执行,然后会把很多其他的类Load进来,动态加载机制. 测试动态加载机制: 新建项目Reflection,new一个class,TestDynamicLoading: public class Tes

MyBatis --- 映射关系【一对一、一对多、多对多】,懒加载机制

映射(多.一)对一的关联关系 1)若只想得到关联对象的id属性,不用关联数据表 2)若希望得到关联对象的其他属性,要关联其数据表 举例: 员工与部门的映射关系为:多对一 1.创建表 员工表 确定其外键是部门表的 id DROP TABLE IF EXISTS emp; CREATE TABLE emp( id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, emp_name VARCHAR(255) DEFAULT NULL, gender CHAR(1

深入理解ClassLoader(四)—类的父委托加载机制

上几次我们介绍到了JVM内部的几个类加载器,我们来重新画一下这个图,再来看一下他们之间的关系. JVM的ClassLoader采用的是树形结构,除了BootstrapClassLoader以外?每个ClassLoader都会有一个parentClassLoader,用户自定义的ClassLoader默认的parentClassLoader是SystemClassLoader,当然你可以自己指定需要用哪一个ClassLoader的实例,我们来看他的API 默认的无参构造方法使用的是SystemCl

nodejs 模块以及加载机制,主要讨论找不到模块的问题

最主要的一个思想,加载模块无非就是找到模块在哪,只要清楚了模块的位置以及模块加载的逻辑那么找不到模块的问题就迎刃而解了.本文只是综合了自己所学的知识点进行总结,难免出现理解错误的地方,请见谅. nodejs的模块分类 1.原生模块:http  fs path等,这些模块都在源码包的lib目录下面,nodejs安装好之后是找不到这些模块的,都作为node.exe的一部分了,require这些模块永远没问题的,如果哪天出现问题了,直接重启电脑或者重装node.有什么疑问可以通过下载源码对这些原生模块

访问修饰限定符的简单总结、final/abstruct/interface对类的限制、自动加载机制、序列化与反序列化【数据持久化和对象的序列化问题】、对象的拷贝(按引用是因为对象标识)和克隆(__clone方法中的this指向)

1.针对访问修饰限定符的理解只需要两点:(1)针对的是类的概念和访问代码的位置来确定是否能够访问(2)对访问修饰限定符的使用时只需要对该成员的使用场景注意即可[也就是内部,继承类,外部进行访问的权限] 不需要对内部进行太多理解[需要对php底层理解时进行理解] [重点][用途]通过访问修饰限定符将内部成员的权限合理的限制,然后再使用公共接口来调用这个基本服务,保证外部不能访问其内部的构件[这样既能够通过类内的设置,将内部的功能实现更好的限制,只有最外层的接口可以正常被访问到,而不了解内部的业务]