Android: LruCache не работает

Вопрос:

Я следил за ссылкой на developer.android.com и создал следующий код:

    final int maxMemory = (int) (Runtime.getRuntime().maxMemory()) / 1024;
final int cacheSize = maxMemory;

mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {

@Override
protected int sizeOf(String key, Bitmap value) {
return super.sizeOf(key, value);
}
};

if(getBitmapFromCache(sBitmapCacheKey) == null) {
Log.e(LOG_TAG, "No image cached");
applyBlur();
}else{
Log.e(LOG_TAG, "Found image cached, applying");
setBackgroundFromCache();
}

метод applyBlur()

    private void applyBlur() {
Log.e(LOG_TAG, "applying blur");
blur(convert(WallpaperManager.getInstance(this).getDrawable()), null);
}

private void blur(Bitmap bitmap, View view) {
long start = System.currentTimeMillis();
float radius = 25;

...

addBitmapToCache(sBitmapCacheKey, overlay);

rs.destroy();
Log.e(LOG_TAG, "It took: " + (System.currentTimeMillis() - start) + "ms");
}

Где applyBlur() – это метод, который я использую для создания Bitamp и добавления в LruCache.

Из Logcat он всегда говорит “Нет кэширования изображений” и создаст совершенно новый Bitmap

Я довольно новичок, поэтому я раньше не использовал кеш, любые идеи были бы очень благодарны, спасибо.

Ответ №1

Ваш кеш не работает по нескольким причинам. Как уже говорилось, вам нужно иметь соответствующие функции размера, в первую очередь. Вы не можете инициализировать кеш к размеру памяти, а затем использовать количество изображений в функции sizeOf (или наоборот). Если вы хотите использовать размер изображения, вам нужно изменить функцию sizeOf на что-то вроде этого:

@Override
protected int sizeOf(final String key, final Bitmap value) {
return value.getRowBytes() * value.getHeight();
}

Во-вторых, вам нужно лучше понять, как используется кеш, и как работает жизненный цикл Activity. Создание и сохранение этого в Activity не будет работать, потому что действие может быть в любой момент может быть уничтожено операционной системой Android, что приведет к сбою вашего кэша (удалению из памяти). Один из способов избежать этого – создать новый класс, который расширяет LruCache, а затем использовать одноэлементную функцию getter, которая инициализирует кеш, и доступна для всех, кто может использовать. Вот пример:

public final class Example extends LruCache<String, Bitmap> {

private static Example instance;

private Example(final int maxSize) {
super(maxSize);
}

public static Example get() {
if (instance == null) {
final int cacheSize = (int) (Runtime.getRuntime().maxMemory()) / 1024;
instance = new Example(cacheSize);
}
return instance;
}

@Override
protected int sizeOf(final String key, final Bitmap value) {
return value.getRowBytes() * value.getHeight();
}

}

Чтобы использовать это в своей Activity, вы просто вызываете Example.get(), и это будет постоянно предоставлять вам один и тот же кеш каждый раз во всех ваших действиях, гарантируя, что если вы храните битмап в одном действии, то он доступен для любой другой деятельности.

Оцените статью
TechArks.Ru
Добавить комментарий