使用LRU Cache时避免使用字符串分配

时间:2013-04-27 07:05:17

标签: java android string caching stringbuffer

我使用LRU和磁盘缓存来缓存内存和磁盘上的一些图像。 以前我用过

private LruCache<String, Bitmap> mMemoryCache;

保存图像,但是当我观察分配堆栈时,我看到很多String分配,这对我来说很清楚,因为每次使用mMemoryCache.get(cs);它都会分配一个新的String对象。

在我绘制每个位图的过程中,我需要每帧使用大约50-100次的缓存,因为生命串很短,会导致很多GC。

我该如何防止这种情况?

我查看了有关如何防止字符串分配的其他问题,例如this one,我使用David的解决方案来显示调试FPS,但我无法将其用于此特殊缓存版本。

我将每张图片分成100x100个图块, 我的缓存键看起来像pageNumber-withcount-heightcount-zoomfactor

我尝试使用StringBuffer但这不起作用,因为toString()会分配新的String,我需要比较内容。 我可以尝试使用带有000的int / float替换“ - ”,或者甚至使用我的缓存类中的char []数组,但是最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

为什么不使用Integer作为缓存键并按如下方式计算(假设zoomfactor也<100):

int keyInt = (((pageNumber * 100 + withcount) * 100) + 
              heightcount) * 100 + zoomfactor;
Integer key = Integer.valueOf(keyInt);

这仍将分配对象,但Integer.valueOf已经为其中一些对象提供了缓存,并且对象将更小。自动装箱也会使用Integer.valueOf(不会为小数字创建新实例),只需避免使用新的Integer()。