这几天做一个界面的时候遇到了OOM问题;
要解决首先就要知道什么原因可以导致OOM;
1.内存泄露。
2.加载图片内存溢出。
我是因为要做下面这个界面
这是需要要加载很多张图片在一个界面中。
所以我的问题主要是在加载图片溢出
所以解决思路主要是从改变一张图片的占用内存的大小来解决Android 中一张图片的占用内存主要是和长度,宽度,单位像素所占的字节数有关
内存 = 图片长度 * 图片宽度 * 单位像素占用的字节数;
所以可以通过改变他的长宽或者改变单位像素来解决
我使用的是改变单位像素占用的字节数来控制内存。
创建一个BitMap时,其单位像素占用的字节数由其参数 BitmapFactory.Options 的 inPreferredConfig 变量决定。
inPreferredConfig为 Bitmap.Config 类型, Bitmap.Config 类 是个枚举类型,我从网上荡了一张这个图:
ARGB代表的意思分别是
A:透明度
RGB就是三原色
所以我们可以通过改变这个枚举变量来达到减少占用内存的目的。
我就是使用这个出发点解决了OOM问题;
我解决的代码:
public static Bitmap readBitMap(Context context, int resId) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;//决定单位像素占用的字节数
//Bitmap.config 是一个枚举类型
//设置色彩使得图片占用内存变少
opt.inPurgeable = true;
// 如果 inPurgeable 设为True的话表示使用BitmapFactory创建的Bitmap 而且当系统内存不够的时候ture表示
//允许把这快内存擦除
opt.inInputShareable = true;
//获取资源图片
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is, null, opt);//不会根据机器的分辨率来自动适应
//Bitmap占用内存的算法
//图片的width*height*Config 长 宽 单位像素占用的字节数
}
以上由加载图片太多而产生的OOM问题就解决了。
以下是一些别的东西我也没太搞懂…….
据说这里的Bitmap占用的是Native层的内存
VM把内存分成了两块一块是java一块就是native 这两块的内存不能共享。
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信
可以搞一些动态链接库来提高效率 可是 百度有很多怎么写我一个也没有写过所以不太清楚
不过观察一下jdk目录下有一个include文件夹
里面放的都是.h文件 应该这里就用了这个吧。应该就和native有点关系了 大概就知道这些
后面这一点我在说什么我也不知道
以上 over!