Android ImageDownloader类中可能出现的BUG:sHardBitmapCache应该是不是静态的?

Iss*_*ram 6 java performance android 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

哪个Google似乎将其版本放入并放入他们的示例类: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);
Run Code Online (Sandbox Code Playgroud)

现在来看看硬缓存:

    // 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;
        }
    };
Run Code Online (Sandbox Code Playgroud)

硬盘的缓存不是 静态的,而软高速缓存是静态的.因此,硬件缓存实例以及项目随着类实例的生命而被清除.

我认为这是真的的原因是我注意到我的应用程序使用ListView/ImageView,每次下载图像并且从不缓存它.这一切都是异步完成的,但每次都在打网.我通过Log.d()在我的方法中放入一个声明来验证这一点,该声明可以访问网络并查看它被调用的时间/频率.

添加static关键字修复了问题,我的应用程序性能更高.

我不确定为什么会这样,因为我的适配器中只有一个ImageDownloader类的实例,如示例所示:

private final ImageDownloader imageDownloader = new ImageDownloader();
Run Code Online (Sandbox Code Playgroud)

问题

所有这些说,有没有其他人经历过这个?或者我是某种疯狂/错误的组合.我不是Java/Android/JVM/Dalvik/WeakReference/SoftReference专家,但似乎有些不对劲.我不知道为什么sHardBitmapCache不是静态的,但是当我做出改变时,我的应用程序停止了对网络的大量打击(节省了数据成本/电池排水/性能改进).

小智 2

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

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