En la mayoría de los casos, las funciones de conversión se llaman con frecuencia. Podemos optimizarlo agregando memorización. Por lo tanto, no calcula cada vez que se llama a la función.
Declaremos un HashMap que almacenará los valores calculados.
private static Map<Float, Float> pxCache = new HashMap<>();
Una función que calcula valores de píxeles:
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 función de memorización que devuelve el valor de HashMap y mantiene el registro de los valores anteriores.
La memorización se puede implementar de diferentes maneras en Java. Para 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 admite la función Lambda :
public static float convertDpToPixel(float dp, final Context context) {
pxCache.computeIfAbsent(dp, y ->calculateDpToPixel(dp,context));
}
Gracias.