2015-08-23 2 views
0

У меня есть список CardView s, которые содержат Bitmap s, которые возвращаются из сети или из LruCache.Singleton instance of Palette Color cache

Я также запускаю операцию 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); 
    } 

} 

Любые критические замечания такого подхода? Если да, то какие альтернативы?

ответ

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

} 
+0

Можете ли вы привести пример того, как «enum' будет работать в« RecyclerView.Adapter <> »? – AndyRoid

+0

Также не являются ли 'enum' s вообще плохой практикой на Android? – AndyRoid

+0

Посмотрите раздел «Избегайте перечислений», это от кого-то, кто работает в команде Android UI. https://medium.com/google-developers/developing-for-android-ii-bb9a51f8c8b9 – AndyRoid