【发布时间】:2013-04-21 09:21:12
【问题描述】:
我使用 LRU 和磁盘缓存将一些图像缓存在内存和磁盘上。 以前我用过
private LruCache<String, Bitmap> mMemoryCache;
为了保存图像,但是当我查看分配堆栈时,我看到了很多字符串分配,这对我来说很清楚,因为每次我使用 mMemoryCache.get(cs); 它都会分配一个新的字符串对象。
在我绘制每个位图的过程中,我需要使用缓存大约 50-100 次每帧,由于短活字符串,这将导致大量 GC。
如何防止这种情况发生?
我查看了有关如何防止字符串分配的其他问题,例如 this one,我使用 David 的解决方案来显示 Debug FPS,但我不能将它用于这个特殊的缓存版本。
我将每张图片分成 100x100 的图块,
我的缓存键看起来像这样pageNumber-withcount-heightcount-zoomfactor
我尝试使用StringBuffer,但这不起作用,因为toString() 将分配一个新的String,我需要比较内容。
我可以尝试使用带有 000 的 int/float 来代替“-”,甚至可以在缓存类中使用 char[] 数组,但是最好的方法是什么?
【问题讨论】:
-
为什么不使用 Integer 作为缓存键并计算如下(假设 zoomfactor 也
-
这就是我接下来尝试的方式,根据给定的数字获取一个数字。这看起来也不错,它会导致 GC 启动的频率降低。我认为这是一个好方法,但有一个问题:为什么我们还要再一次将 int 转换为带有 valueOf 的 int?你说是因为内部缓存?
-
实际上Java在隐式转换中自动装箱时会自动调用valueOf()。我只是想指出,不应使用 new Integer() 将“int”转换为“Integer”。
-
到目前为止,谢谢,这比我想象的要容易...我现在使用与稀疏数组略有不同的公式,到目前为止我没有任何问题。如果你不介意,你可以回答这个问题,然后我会关闭这个。谢谢
标签: java android string caching stringbuffer