In den meisten Fällen werden Konvertierungsfunktionen häufig aufgerufen. Wir können es optimieren, indem wir Memoisierung hinzufügen. Es wird also nicht jedes Mal berechnet, wenn die Funktion aufgerufen wird.
Deklarieren wir eine HashMap, in der die berechneten Werte gespeichert werden.
private static Map<Float, Float> pxCache = new HashMap<>();
Eine Funktion, die Pixelwerte berechnet:
public static float calculateDpToPixel(float dp, Context context) {
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
float px = dp * (metrics.densityDpi / 160f);
return px;
}
Eine Memo-Funktion, die den Wert von HashMap zurückgibt und die Aufzeichnung vorheriger Werte verwaltet.
Memoization kann in Java auf verschiedene Arten implementiert werden. Für 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 unterstützt die Lambda-Funktion :
public static float convertDpToPixel(float dp, final Context context) {
pxCache.computeIfAbsent(dp, y ->calculateDpToPixel(dp,context));
}
Vielen Dank.