Я следил за ссылкой на 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
Я довольно новичок, поэтому я раньше не использовал кеш, любые идеи были бы очень благодарны, спасибо.
Ваш кеш не работает по нескольким причинам. Как уже говорилось, вам нужно иметь соответствующие функции размера, в первую очередь. Вы не можете инициализировать кеш к размеру памяти, а затем использовать количество изображений в функции 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()
, и это будет постоянно предоставлять вам один и тот же кеш каждый раз во всех ваших действиях, гарантируя, что если вы храните битмап в одном действии, то он доступен для любой другой деятельности.