我有一个自定义列表视图。 因为我列出了大约200张图片。这些图片存储在我的可绘制对象中。 我已经将图像转换为位图,并且将图像显示为位图。 每次打开活动时,图像都会列出。 这样,当我调用该活动约10次时,它崩溃了并且错误是
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
然后我回收了位图,并通过使用System.gs函数得到了以下内容
Clamp target GC heap from 25.464MB to 24.000MB
GC freed 322 objects / 70664 bytes in 146ms
Clamp target GC heap from 25.471MB to 24.000MB
GC freed 2 objects / 48 bytes in 138ms
Forcing collection of SoftReferences for 10720-byte allocation
Clamp target GC heap from 25.269MB to 24.000MB
DEBUG/dalvikvm(15311): GC freed 5080 objects / 211168 bytes in 121ms
ERROR/dalvikvm-heap(15311): Out of memory on a 10720-byte allocation
现在至少我得到了这个Out of memory on a 10720-byte allocation错误
现在如何解决错误,请帮我的朋友
您是否可以避免将图像转换为位图,而是通过其资源ID引用它们?
您可以发布代码吗?
我们从中钳位目标GC堆是什么意思
让我们仔细检查您的情况:
是否每次都创建一个新活动,而您忘记完成上一个活动? 如果这样做,请确保通过将内存转储到.hprof文件中并使用MemoryAnalyzer(http://www.eclipse.org/mat/)来配置应用程序。 检查您在内存中拥有的活动实例数,以确保将其清除。
如果要重新加载相同的数据,则可能需要保留此活动,并在启动它时使用FLAG_ACTIVITY_REORDER_TO_FRONT,因此不需要重新创建
您的可绘制对象有多大? 您可能需要先调整大小,然后再将其设置为ImageView
让我考虑更多可能有用的内容,以后再添加
您是否尝试过将位图变量设置为软引用?
+1,但我认为您需要对软参考进行更多说明。
基本上,您可以使用几种引用类型来声明变量。 其中一个是软引用,另一个是WeakReferences。 还有更多..但是我忘了他们从我的头顶上掉下来。 通常,它所做的是通过给变量一定的引用层次结构来声明垃圾收集器何时收集变量。 这是一个很好的链接,给出了非常清晰的描述。 比我的要好得多。
对于Android应用程序,显然不建议使用Java软引用。 参见此处developer.android.com/training/displaying-bitmaps/以及stackoverflow.com/questions/11972441/