Вопрос по performance, java, android – Возможная ошибка в классе Android ImageDownloader: sHardBitmapCache НЕ статичен, когда это должно быть? [закрыто]

6

Я пытался узнать как можно больше о разработке 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 довольно часто сбрасывает мягкий кэш.

Однако, взглянув на код, можно задаться вопросом, будет ли жесткий кэш случайно сбрасываться каждый раз при создании экземпляра родительского класса.

Сначала мягкий кеш:

<code>    // 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);
</code>

Теперь взглянем на жесткий кеш:

<code>    // 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;
        }
    };
</code>

hard cache являетсяnot static, а софт кеш статический. Таким образом, экземпляр жесткого кэша и, следовательно, элементы очищаются со временем существования класса.

Причина, по которой я думаю, что это правда, заключается в том, что я заметил, что мое приложение с ListView / ImageView загружало изображение каждый раз и никогда не кэшировало его. Все было сделано асинхронно, но каждый раз попадало в сеть. яverified это, положивLog.d() утверждение внутри моего метода, который попадает в сеть и видит, когда / как часто он вызывался.

Adding the static keyword fixed the issue and my application is much more performant.

Я не уверен, почему это так, поскольку в моем адаптере есть только один экземпляр класса ImageDownloader, как показано в примере:

<code>private final ImageDownloader imageDownloader = new ImageDownloader();
</code>

ВОПРОС

С учетом всего сказанного, кто-нибудь еще испытывал это ??? Или я сочетание сумасшедшего / неправильного как-то. Я не эксперт по Java / Android / JVM / Dalvik / WeakReference / SoftReference, но что-то не так. Я не знаю почемуsHardBitmapCache не был сделан статичным, но когда я внес изменение, мое приложение перестало так сильно бить в Интернете(saving on data costs / battery drainage / performance improvements).

Я только кратко рассмотрел код, но кажется, что вы правы - я подозреваю, что sHardBitmapCache должен был быть статическим, особенно с учетом его именования. JesusFreke

Ваш Ответ

1   ответ
2

Я исправил код в дереве исходного кода Android. Спасибо за этот отзыв.

Нет проблем. Я заметил, что оригинальный код был разветвлен / скопирован на GitHub много раз. Если это не слишком большая проблема, возможно, было бы целесообразно обновить сообщение в блоге, чтобы сообщество могло распознать это изменение. Issa Fram

Похожие вопросы