Nella maggior parte dei casi, le funzioni di conversione vengono chiamate frequentemente. Possiamo ottimizzarlo aggiungendo memoization. Pertanto, non viene calcolato ogni volta che viene chiamata la funzione.
Dichiariamo una HashMap che memorizzerà i valori calcolati.
private static Map<Float, Float> pxCache = new HashMap<>();
Una funzione che calcola i valori dei pixel:
public static float calculateDpToPixel(float dp, Context context) {
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
float px = dp * (metrics.densityDpi / 160f);
return px;
}
Una funzione di memoization che restituisce il valore da HashMap e mantiene il record dei valori precedenti.
La memoization può essere implementata in diversi modi in Java. Per Java 7 :
public static float convertDpToPixel(float dp, final Context context) {
Float f = pxCache.get(dp);
if (f == null) {
synchronized (pxCache) {
f = calculateDpToPixel(dp, context);
pxCache.put(dp, f);
}
}
return f;
}
Java 8 supporta la funzione Lambda :
public static float convertDpToPixel(float dp, final Context context) {
pxCache.computeIfAbsent(dp, y ->calculateDpToPixel(dp,context));
}
Grazie.