Кэширование изображений волейбола

Я пытаюсь понять кэширование изображений Volley. У меня есть фрагмент с gridview внутри него, который будет загружать около 12-30 изображений. Изображения извлекаются с сервера, и я использую NetworkImageView для загрузки этих изображений.

Я могу отображать изображения в NetworkImageView, и все работает нормально. Но, когда я перехожу от одного fragment к другому и возвращаюсь к предыдущему фрагменту, в LogCat, я вижу, что Volley пытается снова получить изображения.

Я читаю, что Volley автоматически заботится о кэшировании изображений. Когда изображение кэшируется в первом fragment, почему он пытается получить изображение снова, когда я вернулся со второго на первый? Во-первых, это данные LogCat, показывающие запросы волейбола? или что-то еще...

Ниже мой код:

В onCreate()

queue = Volley.newRequestQueue(getActivity());
imageLoader = new ImageLoader(queue, new ImageLoader.ImageCache() {
    private final LruCache<String, Bitmap> mCache = new LruCache<String, Bitmap>(
            10);

    public void putBitmap(String url, Bitmap bitmap) {
        mCache.put(url, bitmap);
    }

    public Bitmap getBitmap(String url) {
        return mCache.get(url);
    }
});

Logcat при первом загрузке фрагмента:

02-18 14:21:20.724: D/Volley(14713): [4944] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-11-57-29-pm.png 0x800c5bdc LOW 2> [lifetime=3782], [size=398563], [rc=200], [retryCount=0]
02-18 14:21:20.874: D/Volley(14713): [4943] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://xx.files.wordpress.com/2014/02/st-vincent.jpg 0x800c5bdc LOW 3> [lifetime=3941], [size=501475], [rc=200], [retryCount=0]
02-18 14:21:20.894: D/Volley(14713): [1] Request.finish: 4181 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-11-57-29-pm.png 0x800c5bdc LOW 2
02-18 14:21:20.974: D/Volley(14713): [1] Request.finish: 4260 ms: [ ] http://xx.files.wordpress.com/2014/02/st-vincent.jpg 0x800c5bdc LOW 3
02-18 14:21:20.994: D/dalvikvm(14713): GC_FOR_ALLOC freed 1914K, 6% free 68371K/72184K, paused 11ms, total 11ms
02-18 14:21:20.994: I/dalvikvm-heap(14713): Grow heap (frag case) to 72.368MB for 5843106-byte allocation
02-18 14:21:21.014: D/dalvikvm(14713): GC_FOR_ALLOC freed 1K, 5% free 74076K/77892K, paused 15ms, total 15ms
02-18 14:21:21.074: D/Volley(14713): [1] Request.finish: 4336 ms: [ ] http://xx.files.wordpress.com/2014/02/underwater.gif 0x800c5bdc LOW 8
02-18 14:21:21.214: D/Volley(14713): [4945] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-4-24-04-pm.png 0x800c5bdc LOW 5> [lifetime=4155], [size=482380], [rc=200], [retryCount=0]
02-18 14:21:21.244: D/Volley(14713): [1] Request.finish: 4494 ms: [ ] http://xx.files.wordpress.com/2014/01/albarn-everyday-robots.jpg 0x800c5bdc LOW 9
02-18 14:21:21.274: D/Volley(14713): [1] Request.finish: 4551 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-4-24-04-pm.png 0x800c5bdc LOW 5
02-18 14:21:21.994: D/Volley(14713): [1] Request.finish: 5244 ms: [ ] http://xx.files.wordpress.com/2014/02/macdemarco_baby.jpg 0x800c5bdc LOW 10
02-18 14:21:22.934: D/Volley(14713): [1] Request.finish: 6183 ms: [ ] http://xx.files.wordpress.com/2014/01/nenehcherry_lank01.jpg 0x800c5bdc LOW 11

Когда я вернусь к тому же фрагменту во второй раз: просто посетил второй фрагмент и вернулся к первому фрагменту - Не так много промежутка между ними.

02-18 14:27:46.164: D/dalvikvm(14713): GC_FOR_ALLOC freed 29047K, 26% free 91776K/122752K, paused 23ms, total 23ms
02-18 14:27:47.994: D/dalvikvm(14713): GC_FOR_ALLOC freed 2957K, 21% free 97010K/122752K, paused 20ms, total 20ms
02-18 14:27:48.274: D/Volley(14713): [1] Request.finish: 3244 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-2-58-16-pm.png 0x800c5bdc LOW 6
02-18 14:27:48.294: D/dalvikvm(14713): GC_FOR_ALLOC freed 2007K, 21% free 97932K/122752K, paused 14ms, total 14ms
02-18 14:27:48.324: D/Volley(14713): [4956] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-11-57-29-pm.png 0x800c5bdc LOW 2> [lifetime=3272], [size=398563], [rc=200], [retryCount=0]
02-18 14:27:48.484: D/Volley(14713): [1] Request.finish: 3456 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-11-57-29-pm.png 0x800c5bdc LOW 2
02-18 14:27:48.974: D/dalvikvm(14713): GC_FOR_ALLOC freed 1030K, 15% free 104815K/122752K, paused 56ms, total 56ms
02-18 14:27:49.054: D/Volley(14713): [1] Request.finish: 4022 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-4-24-04-pm.png 0x800c5bdc LOW 5
02-18 14:27:49.314: D/Volley(14713): [1] Request.finish: 4276 ms: [ ] http://xx.files.wordpress.com/2014/01/albarn-everyday-robots.jpg 0x800c5bdc LOW 9
02-18 14:27:49.374: D/Volley(14713): [1] Request.finish: 4325 ms: [ ] http://xx.files.wordpress.com/2014/01/nenehcherry_lank01.jpg 0x800c5bdc LOW 11
02-18 14:27:49.404: D/Volley(14713): [1] Request.finish: 4355 ms: [ ] http://xx.files.wordpress.com/2014/02/macdemarco_baby.jpg 0x800c5bdc LOW 10
02-18 14:27:49.654: D/dalvikvm(14713): GC_FOR_ALLOC freed 1456K, 12% free 108705K/122752K, paused 27ms, total 27ms
02-18 14:27:49.734: D/Volley(14713): [1] Request.finish: 4691 ms: [ ] http://xx.files.wordpress.com/2014/02/underwater.gif 0x800c5bdc LOW 8
02-18 14:27:50.304: D/dalvikvm(14713): GC_FOR_ALLOC freed 11584K, 16% free 103314K/122752K, paused 47ms, total 47ms
02-18 14:27:50.334: D/Volley(14713): [1] Request.finish: 5281 ms: [ ] http://xx.files.wordpress.com/2014/02/echo-and-the-bunnymen.jpg 0x800c5bdc LOW 12

Как показывают ссылки, Volley обращается к тем же URL-адресам. Вольли пытается получить изображения с сервера? или он просто показывает URL-адреса, которые он загружает из кеша?

Как создать образы кэша волейбола? Если он не обращается к кешированию прямо сейчас, с моим кодом выше, что я должен сделать для его достижения?

Я попробовал изменить значение maxSize с 10 на 100*1024*1024 (100MB), но это не остановилось, когда Volley выдал те же значения.

Ответ 2

Вы можете увидеть в приведенной ниже ссылке, продолжение моего вопроса для реализации Image Caching с помощью Volley с использованием Jake Wharton DiskLruCache и VolleyImageCacheExample. Он работает как ожидалось, и изображения становятся кэшированными. Спасибо за вашу помощь.

DiskLruCache от JakeWharton - как реализовать с помощью Volley?

Ответ 3

Вы используете Volley в качестве сингла? Если вы этого не сделаете, и вы не используете общий контекст для requestQueue, он не будет работать так, как вы ожидаете. Документация по этой части Volley особенно бесполезна (по крайней мере, так как я использовал ее в последний раз). После правильной настройки он будет читать/записывать из кэша, как и следовало ожидать.

Вот проект GitHub с классом VolleySingleton, который вы можете использовать вместе с примерами: CypressNorth/Volley-Singleton

Вот сообщение в блоге, описывающее настройку более подробно: Настройка Android-пользователя Volley ImageLoader для NetworkImageView

Ответ 4

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

Чтобы добавить Glide в ваше приложение:

Шаг 1) Обновить файл build.gradle

dependencies {
    compile 'com.github.bumptech.glide:glide:3.6.1'
    compile 'com.android.support:support-v4:19.1.0'
  }

Шаг 2) Добавить разрешение INTERNET в файле манифеста

<uses-permission android:name="android.permission.INTERNET" />

Шаг 3) Добавить ImageView в макет

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView"
    >
</ImageView>

Шаг 4) Использование глистов в действии

    //Initialize ImageView
    ImageView imageView = (ImageView) findViewById(R.id.imageView);

    //Loading image from below url into imageView
   Glide.with(this)
        .load("IMAGE URL HERE")
        .placeholder(R.drawable.placeholder)
        .error(R.drawable.imagenotfound)
        .override(200, 200);
        .centerCrop();
        .into(imageView);

Подробнее о Android Glide Library

Ответ 5

Вы можете проверить это, я включил механизм кэширования L1 и L2 для Volley.

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

Ответ 6

Простейший способ кэширования изображений с помощью Volley, который я нашел, заключался в использовании RequestQueue с DiskBasedCache. Моя цель заключалась в сокращении полосы пропускания, а не в загрузке. Это также снижает уровень памяти.

 val cacheSizeInMegabytes = 5
 val cacheSizeInBytes = cacheSizeInMegabytes * 1024 * 1024
 val cacheDir = File(context.cacheDir, "volley")
 val cache = DiskBasedCache(cacheDir, cacheSizeInBytes)

 val httpStack = HurlStack()
 val networkStack = BasicNetwork(httpStack)

 val queue = RequestQueue(cache, networkStack)
 queue.start()