У більшості випадків функції перетворення викликаються часто. Ми можемо оптимізувати його, додавши запам'ятовування. Отже, він не обчислює кожен раз, коли функція викликається.
Давайте оголосимо HashMap, який буде зберігати обчислені значення.
private static Map<Float, Float> pxCache = new HashMap<>();
Функція, яка обчислює значення пікселів:
public static float calculateDpToPixel(float dp, Context context) {
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
float px = dp * (metrics.densityDpi / 160f);
return px;
}
Функція запам'ятовування, яка повертає значення з HashMap і підтримує запис попередніх значень.
Пам'ять може бути реалізована різними способами на Java. Для 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 підтримує функцію Lambda :
public static float convertDpToPixel(float dp, final Context context) {
pxCache.computeIfAbsent(dp, y ->calculateDpToPixel(dp,context));
}
Дякую.