android图片内存溢出问题-1

社区资源:
Android有效解决加载大图片内存溢出问题及优化虚拟机内存
http://www.eoeandroid.com/thread-159376-1-1.html
Android 内存溢出解决方案(OOM) 整理总结(转)
http://www.eoeandroid.com/thread-199583-1-1.html
android避免内存溢出
http://www.eoeandroid.com/thread-180008-1-1.html

---------------------帖子正文-----------------------------
写Android代码也有那么三四个月的时间了,也一直都是菜鸟,很多东西都只是拿来就用,也没有想太多的细节问题。 
之前在程序中遇到图片资源的时候,总是使用
BitmapFactory.decodeResource
来设置图片资源,也没发现什么问题。前段时间在写一个动态壁纸程序的时候,可能图片资源比较多,毕竟手机内存还是有限的,程序跑起来有时会
out of Memory
异常。
后来改用BitmapFactory.decodeStream方法,好像能解决问题。

后来在程序中去测试对比了一下,发现还是有比较大的差别的。同样是加载十张图片,我们先看看使用BitmapFactory.decodeResource后的内存占用情况:

?
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
//加载图片前的空余内存空间
long freeStart = Runtime.getRuntime().freeMemory();
bubble2 = BitmapFactory.decodeResource(resources, R.drawable.bubble2);
bubble5 = BitmapFactory.decodeResource(resources, R.drawable.bubble5);
bubble_2 = BitmapFactory.decodeResource(resources, R.drawable.bubble_2);
speeding = BitmapFactory.decodeResource(resources, R.drawable.speeding);
slowing = BitmapFactory.decodeResource(resources, R.drawable.slowing);
resee = BitmapFactory.decodeResource(resources, R.drawable.resee);
network = BitmapFactory.decodeResource(resources, R.drawable.network5);
audio = BitmapFactory.decodeResource(resources, R.drawable.audio);
eye_back = BitmapFactory.decodeResource(resources, R.drawable.eye_back);
eye = BitmapFactory.decodeResource(resources, R.drawable.eye);
//加载图片后的空余内存空间
long freeEnd = Runtime.getRuntime().freeMemory();
System.out.println( "freeStart:" +freeStart+ "\nfreeEnd:" +freeEnd+ "\n 相差:" +(freeStart-freeEnd));


运行结果是:
7139b0e3gba15bb31be51&690.jpg  

再来看看使用BitmapFactory.decodeStream的情况:
?
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public Bitmap readBitmap(Context context, int id){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig=Bitmap.Config.RGB_565; //表示16位位图 565代表对应三原色占的位数
opt.inInputShareable= true ;
opt.inPurgeable= true ; //设置图片可以被回收
InputStream is = context.getResources().openRawResource(id);
return BitmapFactory.decodeStream(is, null , opt);
}
 
 
//加载图片前的空余内存空间
long freeStart = Runtime.getRuntime().freeMemory();
bubble2 = utils.readBitmap(context, R.drawable.bubble2);
bubble5 = utils.readBitmap(context, R.drawable.bubble5);
bubble_2 = utils.readBitmap(context, R.drawable.bubble_2);
speeding = utils.readBitmap(context, R.drawable.speeding);
slowing = utils.readBitmap(context, R.drawable.slowing);
resee = utils.readBitmap(context, R.drawable.resee);
network = utils.readBitmap(context, R.drawable.network5);
audio = utils.readBitmap(context, R.drawable.audio);
eye_back = utils.readBitmap(context, R.drawable.eye_back);
eye = utils.readBitmap(context, R.drawable.eye);
//加载图片后的空余内存空间
long freeEnd = Runtime.getRuntime().freeMemory();
System.out.println( "freeStart:" +freeStart+ "\nfreeEnd:" +freeEnd+ "\n 相差:" +(freeStart-freeEnd));


运行结果是:
7139b0e3gba15a0f5b375&690.jpg  

从两个的运行结果中可以看出,使用   BitmapFactory.decodeResource 来设置图片资源要消耗更多的内存,如果程序中的图片资源很多的话,那这个内存就很客观啦。主要因为是 BitmapFactory.decodeResource 是通过Java层来createBitmap来完成图片的加载,增加了java层的内存消耗。而 BitmapFactory.decodeStream 则是直接调用了JNI,避免了java层的消耗。同时,在加载图片时,图片Config参数也可以有效减少内存的消耗。比如图片存储的位数及options.inSampleSize 图片的尺寸等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值