我一直在尝试尽可能多地学习 Android 开发,特别关注性能,因为今天 Play 商店中的许多应用程序都很缓慢。我发现/被引导到许多文章/视频。
关于图像缓存的一篇具体文章位于:http ://android-developers.blogspot.com/2010/07/multithreading-for-performance.html
谷歌似乎采用了一个版本并将其放入他们的示例类中:http: //developer.android.com/resources/samples/XmlAdapters/src/com/example/android/xmladapters/ImageDownloader.html
总的来说,它是可靠的,除了我认为缓存中的一个缺陷。它使用软/硬缓存将内容放入/获取硬缓存,因为 Android 系统经常重置软缓存。
但是,查看代码时,人们开始怀疑硬缓存是否会在每次父类实例化时意外重置。
首先是软缓存:
// Soft cache for bitmaps kicked out of hard cache
private final static ConcurrentHashMap<String, SoftReference<Bitmap>> sSoftBitmapCache =
new ConcurrentHashMap<String, SoftReference<Bitmap>>(HARD_CACHE_CAPACITY / 2);
现在看一下硬缓存:
// Hard cache, with a fixed maximum capacity and a life duration
private final HashMap<String, Bitmap> sHardBitmapCache =
new LinkedHashMap<String, Bitmap>(HARD_CACHE_CAPACITY / 2, 0.75f, true) {
@Override
protected boolean removeEldestEntry(LinkedHashMap.Entry<String, Bitmap> eldest) {
if (size() > HARD_CACHE_CAPACITY) {
// Entries push-out of hard reference cache are transferred to soft reference cache
sSoftBitmapCache.put(eldest.getKey(), new SoftReference<Bitmap>(eldest.getValue()));
return true;
} else
return false;
}
};
硬缓存不是静态的,而 软缓存是静态的。因此,硬缓存实例和项目都会随着类实例的生命周期而被清除。
我认为这是真的原因是我注意到我的应用程序带有 ListView/ImageView,每次都在下载图像并且从不缓存它。这一切都是异步完成的,但仍然每次都上网。我通过在我的方法中添加一个访问网络并查看它何时/多久调用一次的语句来验证这一点。Log.d()
添加 static 关键字解决了这个问题,我的应用程序性能更高。
我不确定为什么会这样,因为我的适配器中只有一个 ImageDownloader 类的实例,如示例所示:
private final ImageDownloader imageDownloader = new ImageDownloader();
问题
说了这么多,还有人经历过吗???或者我是某种疯狂/错误的组合。我不是 Java/Android/JVM/Dalvik/WeakReference/SoftReference 专家,但似乎有些不对劲。我不知道为什么sHardBitmapCache
不是静态的,但是当我进行更改时,我的应用程序停止访问网络这么多(节省数据成本/电池消耗/性能改进)。