java - Android ImageDownloader类: sHardBitmapCache NOT static when it should be?可能存在BUG

标签 java android performance caching dalvik

<分区>

我一直在尝试尽可能多地学习 Android 开发,特别关注性能,因为如今 Play 商店中的许多应用程序运行缓慢。我发现/被引导到许多文章/视频。

关于图像缓存的一篇具体文章位于:http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

作者在以下位置提供代码:http://code.google.com/p/android-imagedownloader/source/browse/trunk/src/com/example/android/imagedownloader/ImageDownloader.java

谷歌似乎采用了一个版本并将其放入其示例类中: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 没有变成静态的,但是当我进行更改时,我的应用程序停止访问网络太多(节省数据成本/电池消耗/性能改进).

最佳答案

你是对的,这是我的错字。

我已经修复了 android 源代码树中的代码。感谢您的反馈。

关于java - Android ImageDownloader类: sHardBitmapCache NOT static when it should be?可能存在BUG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10135261/

相关文章:

java - 将数组传递给函数并在增强型 for 循环中使用该数组

java - 每个枚举项的编号?

android - 如何在 Kotlin 中将数组转换为集合(HashSet)?

android - 使用导航组件实现 BottomNavigationView 的后退按钮行为

javascript - 如何在 javascript 中更快地查询一长串数据?

python - 快速 python 前端列表扩展

c++ - 实时音频应用,提升性能

java.io.IOException : bt socket is not in listen state [Android Marshmallow] 异常

android - 创建phonegap android项目时出错 cscript 不是可识别的内部或外部命令

java - 错误ArrayIndexOutOfBoundsException仅有时发生,用户权限?