我的应用程序中有一个图像缓存,它使用SoftReferences实现.Dalvik以相对较小的堆启动应用程序,然后在需求的情况下增加它.但我想从一开始就让我的堆大小更大.这是因为当我已经在缓存中有一些图像,并且活动开始(例如)或其他峰值内存需求发生时,我的缓存被清除,以便为该峰值需求提供内存.结果,在峰值消失后,我仍然有2-3 MB的可用空间,但我的缓存是空的!
我看到这个问题的解决方案是预先分配一个更大的正式堆,所以即使峰值消耗为2-3 MB,它仍然有一些空间,所以我的SoftReferences不会被清除.
我发现这VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE)会有所帮助.尤其是,谷歌使用,在他们的应用程序,如提到这里.但是,VMRuntime类已标记为已弃用,并且在将来的版本中表示将从公共API中删除.所以setMinimumHeapSize不是一个永久的解决方案.
然后我如何让Dalvik在启动时增加我的堆?
目前,我通过分配一个大型数组并释放它来使用一种非常简单和俗气的技术.这使得Dalvik成长为我想要的堆.但是,我确信必须有更优雅的方式.你能告诉我吗?
我正在为我的Android应用程序实现缓存机制.
我用过SoftReference,就像我发现的许多例子一样.问题是,当我向上或向下滚动时ListView,大部分图像已被清除.我可以在LogCat中看到每次应用程序加载新图像时我的应用程序都是垃圾回收.这意味着大部分不可见的图像ListView都消失了.
因此,每次我回滚到较早的位置(之前我真的下载过图像)我必须再次下载图像 - 它们不会被 缓存.
我也研究过这个话题.根据Mark Murphy在本文中的说法,似乎存在(或者是?)一个bug SoftReference.一些其他结果表明相同的事情(或相同的结果); SoftReference太早被清除了.
有没有可行的解决方案?