我按照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
我是一个新手,所以我之前没有使用过缓存,任何想法都会非常感谢,谢谢。
答案 0 :(得分:2)
您的缓存无法正常工作有几个原因。如前所述,首先需要具有匹配的大小函数。您无法将缓存初始化为内存大小,然后在sizeOf
函数中使用图像计数(反之亦然)。如果您想使用图片大小,则需要将sizeOf
函数更改为以下内容:
@Override
protected int sizeOf(final String key, final Bitmap value) {
return value.getRowBytes() * value.getHeight();
}
其次,您需要更好地掌握缓存的使用方式,以及Activity
生命周期的工作原理。在Activity中创建和存储它不会起作用,因为Android操作系统可能随时会破坏Activity,这将导致您的Cache被垃圾收集(从内存中删除)。
避免这种情况的一种方法是创建一个扩展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()
,这样就可以在所有活动中始终为您提供相同的缓存,确保在存储位图时在一个活动中,它也适用于任何其他活动。