Android 在一个Activity显示多张从SD卡上获取的图片,出现java.lang.OutOfMemory错误

真机调试(三星tab2\10.1寸设备)应用的大概功能:前面通过调用相机拍摄获取一系列的照片,通过画图获取签名(保存为图片),这些图片都保存在SD卡目录下,然后最后一个A... 真机调试(三星tab2\10.1寸设备) 应用的大概功能:前面通过调用相机拍摄获取一系列的照片,通过画图获取签名(保存为图片),这些图片都保存在SD卡目录下,然后最后一个Activity将所有图显示出来,结果报错,错误信息如下:
如果单独一个结果页面将所有的图片显示出来没有报这样的错误,但是整个工程运行到最后一个页面的时候就报java.lang.OutOfMemory的错误
展开
 我来答
大菜篮子
2013-07-17 · TA获得超过762个赞
知道小有建树答主
回答量:83
采纳率:100%
帮助的人:128万
展开全部
可能的解决方法,你试试:
1、减小图片大小
private String fileName= "/sdcard/DCIM/Camera/2010-05-14 16.01.44.jpg";
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一
Bitmap b = BitmapFactory.decodeFile(fileName, options);
preview.setImageBitmap(b);

2、自定义堆空间
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);
//设置最小heap内存为6MB大小。

3、回收已加载图片对象
if(bitmapObject.isRecycled()==false) //如果没有回收
bitmapObject.recycle();
更多追问追答
追问

这三种办法我在之前都全试过了,没有奏效,而且自定义堆空间是针对虚拟机上面的吧,我自己调试的过程中,程序跑到这一句Bitmap bm= BitmapFactory.decodeFile(fileqr, opts);弹出这样的窗口:

然后后面就出错了....  求大神解答~   

追答
是定义虚拟机的堆,加载图片需要它。内存溢出的原因就是为程序分配的堆空间不够了。VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); 可以设置堆空间,最好在程序一开始就这样设置,我没试过你试试。

弹出这样的窗口意味着你的类库有两个一样的类文件,也就是包冲突,你可以查看一下,但我猜测这和包冲突应该无关,除非引起冲突的包很老。
总之,要么节省堆空间,要么扩大堆空间。另外,如果不是特别必要,你完全可以调用系统自带的图片浏览器来看你的图片,效果远好于自己开发的,发个Intent即可。

仅供参考
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dut_wish
2013-07-17 · TA获得超过1634个赞
知道小有建树答主
回答量:301
采纳率:0%
帮助的人:502万
展开全部
先扫一遍数据目录,把所有文件,都生成一个缩略图。一般取原图的1/10 1/8大小

造缩略图用Bitmap类的compress方法

然后定义一个封装类比如
class ImageData{

String orgImagePath;

Drawable thumb;
}

把扫描得到的原图路径和缩略图数据放在一个List<ImageData>中

这样,你的图片浏览背景是一个图片展示控件(比如说ImageSwitch)
底部是一个画廊。

画廊数据源用List<ImageData>的缩略图
选择具体的图片时,ImageSwitch加载原图,切换到其他图片时,把上一张原图释放掉

这样比较节省内存。

给单位做过超大图片浏览器,就是这样的,单张图片20M,缩略图生成的1/20的,只要单张图片加载不死,一个目录下百来张图片,浏览起来就不会抛内存异常。
只是加载单张原图略慢。
追问
这个方法我有考虑过,但是太麻烦复杂了,我显示结果的Activity主要的功能很简单,就单纯是将SD卡里面的六张图(PS:每张图的大小都没超过200K)拿出来,然后分别放在六个ImageView上显示出来。单独这样一个Activity放在真机上运行一点问题都没有,但是整套应用跑下来,跑到最后一个页面就崩掉了,补充一下,应用的前部分功能是拍摄照片,并保存到SD卡上,照片已经经过压缩处理过。
追答
你直接载入6张原图,出现这种太正常了。虽然你的照片压缩过,但是它们载入成Drawable都是Bitmap数据也就是经过解压的。200多K的JPEG解压成Bitmap,假设是32位位图,照片分辨率1024×768,这样一个Bitmap也会占到3M以上。而且你的照片肯定不止1024×768。

当然这样的内存消耗量,其实不是非常大。在应用的配置里面设置了largeheap应该就可以接受

这是我的一个应用的配置,不设largeHeap=“true”,大概整个应用分配30M-50M内存时候就会memoryout了,设立largeheap的话,最大时候我分配了200M还没抛异常。当然,太低版本的sdk不支持largeHeap。要支持低版本还是用缩略图比较妥当

而且缩略图一点不麻烦,也就是多了100来行代码而已。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式