一、复用 bitmap
1、 常见的图像格式: jpg, png, webp。
JPG:有损压缩,
PNG: 无损压缩
- WEBP:克服 前两种格式的缺点。无损压缩时,极大地压缩体积。推荐
但是Android 4.2之后才支持 这种格式。
2、解码(decode)
常见的存储格式,是一种编码格式。既然有编码,就会有解码。
这些常见的格式在 Android中要显示图片,必须先经过解码(decode),变成GPU能够识别的格式,读取图像的数据到内存中。
Android解码 主要是使用 BitmapFactory类提供了常用的一些decode方法。
图片真正占用内存大小要看decode之后的数据大小 ,decode之后是一个字节码数组存在。
解码:
- 将图像的数据读取到内存中
- 将其转换为GPU能识别的格式
- 再由GPU 显示到显示屏上
3、Bitmap memory
a、 <= 2.3.3( api 10)
Bitmap解码之后的数据存储在Native Memory 中
手动调用Recyle 回收
b、 >= 3.0 ( api 11 )
Bitmap解码之后的数据存储在 Dalvik heap中
Dalvik 自动回收
对象池–内存缓冲区间。
避免再产生 JVM 收回内存
4、复用Bitmap内存
新创建的Bitmap对象并没有让虚拟机再开辟一块内存空间, 复用之前的上一个Bitmap的内存空间
SDK 11–18, 运用上面的方法有限制, 两幅图片宽高必须一样。
SDK19—- , 允许 宽高不一致,只要比原来的大就行。
5、库推荐
glide , 非常好的库。 关于Bitmap,有了这个库,就不用自己实现了。
二、 预压缩 Bitmap
1、 createScaledBitmap( inBmp, 64, 128 ) ,缩放为指定的宽高的图片。
该方法不好用。 是在解压,消耗内存之后,GPU显示时,显示一副小图片,并没有达到减少内存消耗的目的。
2、insampleSize
我们想要的效果是,加载一张缩小过的 图片 在内存中,从而降低内存消耗。
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize=4;
Bitmap bitmap=BitmapFactory.decodeResource
(getResources(), R.drawable.big,options);
不同的 insampleSize,不同的图片。
3、如何获取原图的宽,高。进行指定的缩放
怎样的insampleSize是合适的,就需要知道原图的宽高,才能进行合适的缩放。
//设置为true,解码只会获得图片的宽高,而不会获得图片
options.inJustDecodeBounds=true;
BitmapFactory.decodeResource(getResources(), R.drawable.big,options);
int originWidth=options.outWidth;
int originHeight=options.outHeight;
// 设置为false,解码时才能得到bitmap
options.inJustDecodeBounds=false;
上图中第一行代码设定后,只会获取 图片的宽高数据。 而不加载,占用内存。
三、 减少占用字节
1、其它方式,将bitmap占用的内存进行减小。并不是用裁剪Bitmap宽高来做的,而是减小每一个像素占用的字节数来做的。
2、区分不同的场景, 使用不同的解码格式,从而达到节约内存的目的。
- PNG—- 4个字节, ARGB
- JPG —–三个字节 RGB 。 区分需不需要支持 A(alpha透明度)
- Android 默认采用 解码 为 ARGB-8888 格式.
如果想要其他格式,需要手动调整,如第二行代码
比较耗时, decode 放到 异步线程去做
3.推荐库
picasso 图片库,兼容 web p
四、 LRUCache 介绍——算法
1、 原则: 当我需要从缓存中删除一些数据时,会删除最近最少使用的数据。
support v4包,提供了 LRUCache的实现。
2.使用
a、new 一个对象LRUCache, <键,值>(默认大小)
默认大小是一个经验值,当前系统内存的 1/8 等等。
b、继承 ,定义 里面图片的大小
c、使用,解码到Bitmap后, 用put方法装进去就可以
参数1, 文件名当key, 参数2, Bitmap当 value。
3、 LRUCache介绍
内存缓存技术对那些大量占用应用程序宝贵内存的图片提供了快速访问的方法。其中最核心的类是LruCache (此类在android-support-v4的包中提供) 。这个类非常适合用来缓存图片,它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。
五、工具 Profiling
1、 作用
在程序运行时,每个方法运行消耗的时间, 会以图表的形式展示出来。每个线程所 消耗的时间。
2、打开及使用:
a、菜单栏
b、 点击 左边红线处,开始,使用, 再次点击,结束 。出现每个方法消耗时间的效果图。
六、 LINT TOOL 工具
1、作用
对Java代码做一些静态检查,代码可用性,安全性,国际化,性能等等。而且可以自定义做什么检查。
2、打开及使用:
a、菜单栏 Analyse—Instan
b、点击,就会显示出检查结果
c、对Lint进行设置