Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6658330
  • 博文数量: 915
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8846
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(915)

文章存档

2022年(9)

2021年(13)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Java

2013-10-23 21:04:12

大家都知道,使用Android加载图片时,一般来说加载几个图片都容易OOM,但是Android手机的相册似乎没有这个问题。
思索了很久没有找到办法,和一个哥们讨论次问题时他给出个解决办法:
(下面的文字转自:http://blog.sina.com.cn/s/blog_7139b0e30100xklb.html,所以本博文属于转载)
写Android代码也有那么三四个月的时间了,也一直都是菜鸟,很多东西都只是拿来就用,也没有想太多的细节问题。
   之前在程序中遇到图片资源的时候,总是使用BitmapFactory.decodeResource来设置图片资源,也没发现什么问题。前段时间在写一个动态壁纸程序的时候,可能图片资源比较多,毕竟手机内存还是有限的,程序跑起来有时会out of Memory异常。后来改用BitmapFactory.decodeStream方法,好像能解决问题。
    后来在程序中去测试对比了一下,发现还是有比较大的差别的。同样是加载十张图片,我们先看看使用BitmapFactory.decodeResource后的内存占用情况:
    //加载图片前的空余内存空间
    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));
   运行结果是:
   Android加载大图片内存溢出的问题总结

    
    再来看看使用BitmapFactory.decodeStream的情况:
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));

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

明天去单位实验一下看看,如果可以告诉大家结构。
阅读(4566) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

renxiao20032013-10-25 08:26:14

经实践,似乎确实解决了OOM的问题(至少现在加载十张图片也不会出问题了)

renxiao20032013-10-23 21:14:18

Dalvik提供的dalvik.system.VMRuntime类来设置最小堆内存为例:
  private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
  VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。