图片的cache处理时出现内存溢出(OutOfMemoryError, OutOfMemory)的解决方法

转载 2011年10月12日 19:28:23

在Android应用开发过程中,经常要对图片做cache处理,比如从网络上下载图片后保存到sd卡里,然后放到HashMap<String,Bitmap>里同过ListView显示,当HashMap里的图片很多时就会造成内存溢出的问题,网上的解决方法大多是要求显示的调用Bitmap的recycle()方法释放内存,但是Android官方网站上是不鼓励调用recycle()方法的,而是由GC去做垃圾回收,通过测试,由于HashMap存放的图片并不是顺序存放的,很容易释放掉ListView中正在显示的图片,这样就会出错。

下面介绍下我用的两种方法避免出现内存溢出的问题。

 

1. 通过WeakHashMap<String,Bitmap>弱引用哈希表存放图片,其中key是图片的URL,Value是对应下载的Bitmap,存放到SD卡的名字为URL的hashcode, 由于Android中的onLowMemory方法是系统内存不够时才会触发,应用程序一般超过Android系统规定的内存时,如8M,只会触发OutOfMemoryError异常,onLowMemory()方法并不会调用,我这里的解决方法并不是等到捕获到OutOfMemoryError异常时才去调用WeakHashMap的clear方法, 而是通过检测WeakHashMap中图片的大小接近8M时去clear,让系统GC释放图片。

 

2. 通过SoftReference引用图片,交给系统释放内存,

    1)  定义imageCache = new HashMap<String, SoftReference<Drawable>>();  

    2)  Add图片 imageCache.put(imageUrl, new SoftReference<Bitmap>(bitmap)); 

    3)  Get图片 SoftReference<Bitmap> softReference = imageCache.get(imageUrl);   
                      Bitmap bitmap= softReference.get();

Android out of memory 彻底解决Android因加载多个大图引起的OutOfMemoryError,内存溢出的问题

最近因为项目里需求是选择或者拍摄多张照片后,提供滑动预览和上传,很多照片是好几MB一张,因为目前的Android系统对运行的程序都有一定的内存限制,一般是16MB或24MB(视平台而定),不做处理直接...
  • wulianghuan
  • wulianghuan
  • 2013-09-11 01:08:23
  • 36224

setContentView() 报 OutOfMemoryError的错误

这次的错误是在进行阿里云测Android云测的兼容性测试时发现的。错误日志为: ...
  • wusp258326772
  • wusp258326772
  • 2016-04-05 10:28:55
  • 553

Android加载大图片不OutOfMemoryError

Android加载图片时,对于分辨率小,配置低的机子,很容易发生OutOfMemoryError。手机的内存比图片的大很多,怎么会这样? 在设置Android虚拟机的内存时: RAM:模拟器的内...
  • zengmingen
  • zengmingen
  • 2015-10-27 17:16:00
  • 2212

关于Jmeter测试数据库压力的时候抛出内存溢出outofmemory的解决方法

更改jmeter.bat文件的配置全部都加大 但是最大不超过1500,不然jmeter无法启动,也不知道为什么,主要更改的配置如下 set HEAP=-Xms900m -Xmx13...
  • jintianhen1
  • jintianhen1
  • 2013-12-02 15:31:01
  • 2519

Android "java.lang.OutOfMemoryError"的若干种情形及解决方式

OOM就是内存溢出,即Out of Memory。也就是说内存占有量超过了VM所分配的最大。怎么解决OOM,通常OOM都发生在需要用到大量内存的情况下(创建或解析Bitmap,分配特大的数组等),这里...
  • chichengjunma
  • chichengjunma
  • 2017-01-07 14:23:58
  • 1168

上传大文件报内存溢出错误OutOfMemory

最近一个项目要做大的视频文件的上传和下载。本来以前的项目框架里已经有现成的代码了,是用的springMVC文件上传下载的框架,但是以前都传的小文件,没什么问题,这次需要上传大文件,就老是报错了。 ...
  • dongbang111
  • dongbang111
  • 2015-02-23 23:20:27
  • 3427

在使用BitmapFactory.decodeFile时出现java.lang.OutOfMemoryError

当图片过大,或图片数量较多时使用BitmapFactory解码图片会出java.lang.OutOfMemoryError: bitmap size exceeds VM budget,要想正常使用则...
  • u013985004
  • u013985004
  • 2014-08-25 11:18:32
  • 2007

MyEclipse使用Tomcat,报OutOfMemoryError的解决办法

首先弄清楚是怎么报此内存溢出的问题,出现此问题首先排除程序中是否有错误代码导致的。若以前都运行正常的,由于加入一些功能或修改功能后就突然报此错误,那么我们就应该怀疑是否是我们的环境出问题? ...
  • geyouchao
  • geyouchao
  • 2016-05-31 15:58:25
  • 1044

Android Bitmap OutOfMemory 解决办法

java.lang.OutOfMemoryError解决办法 1.在适当的时候适当的地点回收内存 2.使用BitmapFactory.Options对图片进行压缩 3.优化代码结构...
  • tangnengwu
  • tangnengwu
  • 2014-07-01 14:41:22
  • 2664

问题排查之OOM 之 mina java.lang.OutOfMemoryError(转)

前段时间在测试过程中发现了mina框架的问题:当mina一次传输的文件超过一定值(如55m)或者连续传输文件的次数过于频繁,就会内存溢出: org.apache.mina.filter.codec....
  • sivyer123
  • sivyer123
  • 2013-12-05 12:09:42
  • 4678
收藏助手
不良信息举报
您举报文章:图片的cache处理时出现内存溢出(OutOfMemoryError, OutOfMemory)的解决方法
举报原因:
原因补充:

(最多只允许输入30个字)