createScaledBitmap上的Android OutOfMemoryException和SoftReferences的角色?

createScaledBitmap上的Android OutOfMemoryException和SoftReferences的角色?,android,out-of-memory,drawable,soft-references,Android,Out Of Memory,Drawable,Soft References,我有个房间。我知道前面的问题已经讨论了很多,但我的问题一般都与Android和Java的内部结构有关 当我在随机点加载图像时,我得到了这个可怕的异常 我在HashMap>中有我的图像。根据SoftReferences的定义,如果内存不足,我希望Drawables可以被GC’ed 相比之下,从我之前的研究中,我发现drawable中的位图被分配到与我的应用程序堆不同的本地堆中。这就解释了为什么在DDMS上,尽管我看到了6MB的内存,但我的应用程序仍然崩溃 另外,似乎SoftReference非常适

我有个房间。我知道前面的问题已经讨论了很多,但我的问题一般都与Android和Java的内部结构有关

当我在随机点加载图像时,我得到了这个可怕的异常

我在HashMap>中有我的图像。根据SoftReferences的定义,如果内存不足,我希望Drawables可以被GC’ed

相比之下,从我之前的研究中,我发现drawable中的位图被分配到与我的应用程序堆不同的本地堆中。这就解释了为什么在DDMS上,尽管我看到了6MB的内存,但我的应用程序仍然崩溃

另外,似乎SoftReference非常适合缓存,Android工程师建议使用它

我的问题是,由于我的应用程序堆从未达到最大值,这应该意味着我的软引用从未被GC’ed

我如何解决这个问题?那么,使用软引用真的有什么好处吗?我是不是理解不正确


谢谢

我也遇到了同样的问题,我使用了SoftReference HashMap,但仍然收到OOM错误。我能够摆脱它的唯一方法是不使用大图像,因为BitmapFactory.decodeStream需要大量内存来解码图像

您是否尝试过使用回收方法?这会将位图设置为无用,因此垃圾收集器可以完成其工作。

绝对有意义。那么,我如何才能从我的应用程序中清除这些内容呢?我需要给自己打电话?另外,除非您是在HC中开发,否则将SoftReference用于可绘制缓存的做法似乎也没有帮助。此外,我在之前的某个地方读过,我们不应该只是“取消”可提取的引用。例如,不做位图=null;因为这没有效果。只需调用bitmap.recycle即可。回收似乎是一个更好的选择,因为它可能包括一些本机调用来从Skia清理位图。有什么建议和最佳做法吗?感谢您的回复!读这个