Кэширование изображений волейбола
Я пытаюсь понять кэширование изображений 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 выдал те же значения.
Ответы
Ответ 1
Волейбол не дал возможность кэширования напрямую. вы должны сделать свой собственный в инструменте, предоставляемом Volley. См. Сетевое кэширование изображений, Джейк Уортон написал о механизме кэширования с помощью Volley. Настройка Jake Wharton 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()