Palette Color缓存的Singleton实例



我有一个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);
    }
}

相关内容

  • 没有找到相关文章

最新更新