我有一个CardView
的列表,其中包含从网络或LruCache
返回的Bitmap
。
我还对这些位图运行了Palette.from(Bitmap).generate()
操作。这太贵了。我想把这些调色板颜色保存在某种类型的HashMap<...>
中。
这就是我的想法,对每个项目名称及其相应的颜色值使用HashMap<String, Integer>
。
如果名称发生更改,则更改颜色值。列表中的项目不会经常更改,所以这就是我考虑使用HashMap<String, Integer>
的原因。
其次,将这个HashMap
保存在某个地方,可能在磁盘上,这样当用户再次启动应用程序时,如果Palette
样例已经存在(并且与名称匹配(,就不需要生成它。
我正在考虑以这种方式实现它:
public class PaletteCache {
private static PaletteCache sPaletteCache;
private static HashMap<String, Integer> mCache;
private PaletteCache() {
loadCache();
}
public static PaletteCache getInstance() {
if (sPaletteCache == null)
sPaletteCache = new PaletteCache();
return sPaletteCache;
}
private static void loadCache() {
// Load the HashMap from disk if present
}
public static int getVibrantColor(String itemName) {
return mCache.get(itemName);
}
public static void setColor(String itemName, int color) {
mCache.put(itemName, color);
}
}
对这种做法有什么批评吗?如果是,有哪些替代方案?
在多线程应用程序中,对单例进行延迟初始化的方法将失败。
另一种不存在该问题且不影响性能的方法是使用枚举来实现singleton。
public enum PaletteCache
{
INSTANCE;
private static HashMap<String, Integer> mCache;
private PaletteCache() {
loadCache();
}
public static PaletteCache getInstance() {
return INSTANCE;
}
private static void loadCache() {
// Load the HashMap from disk if present
}
public static int getVibrantColor(String itemName) {
return mCache.get(itemName);
}
public static void setColor(String itemName, int color) {
mCache.put(itemName, color);
}
}