android应用里,最耗费内存的就是图片资源。而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。
一般来说避免oom的方法有这么4种:
1.严格控制内存 bitmap对象在java和C中都有内存占用。即使java回收了bitmap对象,C中的是不会自动释放的。所以需要及时调用recycle函数并去掉强引用,然后提醒虚拟机回收;
2.使用缓存,缓存也分内存缓存和硬盘缓存;
3.捕获异常。一旦加载图片产生异常,捕获并且把默认的图片显示上去;
4.压缩图片。BitmapFactory的options是否自适应这个属性设为true,这样,decodeFile时得到的对象是空的,但是能得到该图片的大小,此时再判断是否需要压缩。
这里非常不建议大家使用createScaledBitmap这个函数,经过测试该函数生成的bitmap对象动辄3M以上,十分危险。
比较好的方法是decodeStream,可以避开java底层函数createdBitmap。decodeFile也不错,然后靠Matrx生成合适大小的图片。