这几天做一个界面的时候遇到了OOM问题;

要解决首先就要知道什么原因可以导致OOM;

1.内存泄露。

2.加载图片内存溢出。

我是因为要做下面这个界面

android的oom问题 android oom_图片


这是需要要加载很多张图片在一个界面中。

所以我的问题主要是在加载图片溢出

所以解决思路主要是从改变一张图片的占用内存的大小来解决Android 中一张图片的占用内存主要是和长度,宽度,单位像素所占的字节数有关

内存 = 图片长度 * 图片宽度 * 单位像素占用的字节数;

所以可以通过改变他的长宽或者改变单位像素来解决

我使用的是改变单位像素占用的字节数来控制内存。

创建一个BitMap时,其单位像素占用的字节数由其参数 BitmapFactory.Options 的 inPreferredConfig 变量决定。

inPreferredConfig为 Bitmap.Config 类型, Bitmap.Config 类 是个枚举类型,我从网上荡了一张这个图:

android的oom问题 android oom_oom_02


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!