Android Volley ImageLoader - параметр BitmapLruCache?
У меня возникли проблемы с реализацией кэша изображений с использованием новой библиотеки Volley. В презентации код выглядит так:
mRequestQueue = Volley.newRequestQueue(context);
mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache());
BitmapLruCache, очевидно, не включен в набор инструментов. Любая идея, как его реализовать или указать на некоторые ресурсы?
http://www.youtube.com/watch?v=yhv8l9F44qo @14: 38
Спасибо!
Ответы
Ответ 1
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageCache {
public static int getDefaultLruCacheSize() {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
return cacheSize;
}
public BitmapLruCache() {
this(getDefaultLruCacheSize());
}
public BitmapLruCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}
Ответ 2
Ficus предоставляет этот пример кода для Bitmap LRU:
https://gist.github.com/ficusk/5614325
Ответ 3
Вот пример использования кэша LRU на основе диска с Volley. Он основан на использовании версии AOSP DiskLruCache, поддерживаемой Jake Wharton. http://blogs.captechconsulting.com/blog/raymond-robinson/google-io-2013-volley-image-cache-tutorial
Изменить: я обновил проект, включив в LOC-кеш памяти в качестве реализации по умолчанию, так как это рекомендуемый метод. Volley неявно обрабатывает кеш-диск на своем кэше L2. Кэш изображения - это только кеш L1. Я обновил исходное сообщение и добавил здесь более подробную информацию: http://www.thekeyconsultant.com/2013/06/update-volley-image-cache.html.
Ответ 4
То, что я советую, использует Bitmap Cache Singleton, поэтому этот кеш будет доступен в течение всего срока действия вашего приложения.
public class BitmapCache implements ImageCache {
private LruCache<String, Bitmap> mMemoryCache;
private static BitmapCache mInstance;
private BitmapCache(Context ctx) {
final int memClass = ((ActivityManager) ctx
.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
// Use 1/16th of the available memory for this memory cache.
final int cacheSize = 1024 * 1024 * memClass / 16;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight();
}
};
}
public static BitmapCache getInstance(Context ctx) {
if (mInstance == null) {
mInstance = new BitmapCache(ctx);
}
return mInstance;
}
@Override
public Bitmap getBitmap(String url) {
return mMemoryCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mMemoryCache.put(url, bitmap);
}
}
Ответ 5
это входит в новый API для обработки OOM
public class BitmapMemCache extends LruCache<string, Bitmap> implements ImageCache {
public BitmapMemCache() {
this((int) (Runtime.getRuntime().maxMemory() / 1024) / 8);
}
public BitmapMemCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap bitmap) {
int size = bitmap.getByteCount() / 1024;
return size;
}
public boolean contains(String key) {
return get(key) != null;
}
public Bitmap getBitmap(String key) {
Bitmap bitmap = get(key);
return bitmap;
}
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}