unk*_*own 6 android heap-memory gallery clear coverflow
在我的应用程序中,我使用简单的画廊和封面流我都有我的封面图像库在图像上点击封面流我被重定向到内容全屏画廊的下一个活动,我甚至可以滚动我的全屏画廊; 但是当我在我的应用程序中放入更多图像或高分辨率图像时,由于位图大小超过VM预算,它会被强制关闭
所以我想在每次完成封面流程和图库时清除堆内存,这样我就可以在我的应用程序中加载任何数量或任何分辨率的图像,这样如果有人可以帮助我...如何清除/清空每次堆内存时我在我的代码中动态完成了我的活动?我已经尝试过recycle和System.gc方法
Jef*_*man 31
你不能"清理堆".当您的对象不再被引用时,VM将自动执行此操作.
话虽这么说,位图在android中是一件难事.内存有限,当图像被解码为位图时,它会占用比压缩图像格式本身更多的内存.
您的解决方案没有简单的答案.即使你正确地做了一切,你可能只是内存不足.话虽如此,这里有一些提示:
使用Bitmap.release().位图的特殊之处在于它们是在本机堆栈(而不是VM)堆上分配的.javadocs有点模糊,说你通常不需要调用它,但根据我的经验,这对VM的"线索"是你完成了支持位图的内存是很重要的.编辑:从Android 3.0(API级别11)开始,像素数据与关联的位图一起存储在Dalvik堆上.
将位图加载到缩放的内存中.这是关于该主题的博客文章.在某些设备上只能获得24MB的堆,而高分辨率的图像在加载到位图对象时会耗尽所有这些.没有办法,所以你必须加载缩放.
不要打电话给System.gc()另一个答案说.构建GC算法的人比你和我聪明; 他们知道自己在做什么.当有可以通过GC释放的内存时,你永远不会得到OOME - GC会在给你一个OOME之前一直运行.
这一点显而易见,但请确保在不再需要位图时不要引用位图.
最后,这个很糟糕,Android不做堆压缩.这是我前一段时间发布的SO问题,没有令人满意的答案.简单地说,Android的永不压缩堆,从而为您的应用程序保持分配大的,甚至是中等大小,块位图,你最终在一个情况下风,而你是不是内存不足,没有足够大的连续你分配的内存块,你得到OOME.正如我在我的问题中所写,解决这个问题的唯一方法是在用户退出时终止应用程序的进程.这使得下次启动变慢,但它保证了一个全新的堆.不要误会我的意思,我不可能相信这是正确的做法,但没有人提出更好的解决方案.
| 归档时间: |
|
| 查看次数: |
18252 次 |
| 最近记录: |