1

我有一个CardViews 列表,其中包含Bitmap从网络或从 a 返回的 s LruCache

我还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);
    }

}

对这种方法有任何批评吗?如果是这样,有什么替代方案?

4

1 回答 1

0

这种对单例进行延迟初始化的方法将在多线程应用程序中失败。

另一种没有该问题且不会影响性能的替代方法是使用枚举来实现单例。

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);
    }

}
于 2015-08-23T06:29:12.093 回答