Bitmap和LruCache
来源:互联网 发布:windows pe 知乎 编辑:程序博客网 时间:2024/06/06 07:31
一,Bitmap
1.什么是bitmap
Bitmap表示的是一张图片,这个图片是原图。BitmapFactory的四个方法:decodeFile, decodeResource, decodeStream,decodeByteArray,分别用于支持从文件系统,资源,输入流,和字节数组中生成一个bitmap对象。
2.bitmap占据的内存大小
以一张512 * 512分辨率,采用ARGB8888格式存储的图片为例,它占用的内存大小 = 512 * 512 4 byte.。其中512 512表示这张图片的宽和高都是512个像素,采用ARGB8888格式存储表示图片的每个像素所占据的内存大小(不是图片在磁盘上文件大小)为4 * 8bit = 4byte。ARGB8888表示每个通道用8位2进制来表示,这里有四个通道即32位2进制,一个字节是8位,所以共4个字节
3.bitmap的压缩
压缩会将原图的尺寸缩小,所占据的内存空间也会缩小,android中对图片的压缩主要是会用到BitmapFactory.options内部类的inSampleSize属性,这个属性,代表采样率,以一张1024 * 1024采用ARGB8888格式存储的图片来说,当采样率inSampleSize = 2时,这张图片的宽和高都变成原来的1/2,即变成了512 * 512大小,宽和高都变成了原来的1/2,所占据的内存大小则变为了原来的1/4。官方文档建议外界传递给系统的inSampleSize应该为2的指数。比如ImageView的大小为100 * 100像素,而原始图片的大小为200 * 300,我们应该采用多大的采样率才能使图片式样ImageView的大小呢。200/100 = 2, 300/100 = 3,如果采样率为2那么采样之后的图片尺寸为100 * 150,这是适合IMageView的,如果采样率为3,采样之后的图片尺寸为200/3 * 100,这样图片在ImageView中显示的时候会有明显的拉伸效果
private int caculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight){ int height = options.outHeight; int width = options.outWidth; int inSampleSize = 1; //目的是为了让inSampleSize为2的指数 if (height > reqHeight || width > reqWidth){ int halfHeight = height / 2; int halfWidth = width / 2; while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth){ inSampleSize *= 2; } } return inSampleSize; }
二,LruCache
缓存
三级缓存:网络缓存,本地缓存,内存缓存。
如果内存中没有就从本地区获取,如果本没有在去网络上获取,这样可以节省流量,提高用户的体验,
我们创建的对象都是会在内存中分配存储空间的,对象里面的数据就是存储在内存当中的,内存缓存就是这个。既然将数据存储存储在对象中就将数据存储在内存中了,那我们为什么还要用到LruCache呢,以Map为例,我们不断调用map.put()方法,那么所占据的内存就会不断增加,android系统为模拟器分配的内存空间为16M,Java中引用都是强引用,垃圾回收不会回收,所以出现内存不足的情况,而LruCache(Least Recently Used)内部也采用了LinkedHashMap,只是说当内存满的时候,会将之前的数据移除出去,最近使用的会被添加到map中去。
//获取系统为该应用分配的最大内存的1/8作为缓存区 long maxMemory = Runtime.getRuntime().maxMemory()/8;//模拟器默认是16M mMemoryCache = new LruCache<String,Bitmap>((int) maxMemory){ @Override protected int sizeOf(String key, Bitmap value) { /* * public final int getByteCount(){ * return getRowBytes() * getHeight(); * } */// return value.getByteCount();这在API12及其以上才能用 return value.getRowBytes() * value.getHeight(); } };
- Bitmap和LruCache
- Bitmap的高效加载和LruCache缓存
- Android LruCache用于Bitmap
- Bitmap以及LRUCache
- Android bitmap 的缓存-LruCache
- Bitmap的缓存(LruCache,DiskLruCache)
- Android中Bitmap的加载和Cache(三级缓存 :LruCache,DiskLruCache)学习笔记
- LruCache 结合 FIFO 策略实现bitmap缓存
- Bitmap.Options和LruCache——Android高效加载大图、多图解决方案,有效避免程序OOM
- LruCache和DiskLruCache
- 内存缓存和LruCache
- 如何解决lrucache不能从内存中回收bitmap
- Bitmap——内存缓存LruCache实现原理
- Android Bitmap高效加载与LruCache内存缓存
- Days 25 LruCache缓存处理&Bitmap二次采样
- LRUCache
- LruCache
- LRUCache
- 剑指offer面试题 求两个链表的第一个公共结点
- java异常处理机制
- ubuntu12.04 android studio 安装
- 轻松把玩HttpClient之模拟post请求示例
- socket接收发送信息
- Bitmap和LruCache
- C++智能指针测试
- accumulate连接string元素
- 灰度模板匹配算法
- C++ vector用法
- JAVA_HOME环境变量失效的解决办法
- 快速排序
- 栈的应用-后缀表达式
- DD语句位置参数