Na maioria dos casos, as funções de conversão são chamadas com frequência. Podemos otimizá-lo adicionando memorização. Portanto, ele não calcula sempre que a função é chamada.
Vamos declarar um HashMap que irá armazenar os valores calculados.
private static Map<Float, Float> pxCache = new HashMap<>();
Uma função que calcula valores de 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;
}
Uma função de memorização que retorna o valor do HashMap e mantém o registro dos valores anteriores.
A memorização pode ser implementada de diferentes maneiras em 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;
}
O Java 8 suporta a função Lambda :
public static float convertDpToPixel(float dp, final Context context) {
pxCache.computeIfAbsent(dp, y ->calculateDpToPixel(dp,context));
}
Obrigado.