2014-02-18 4 views
10

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

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

+0

+1 за правой хорды – Sameer

ответ

11

Волейбол не дал возможность кэширования напрямую. вы должны сделать свой собственный в инструменте, предоставляемом Volley. См. Network Image caching, Джейк Уортон написал о механизме кеширования с помощью Volley. Jake Wharton's Volley Customization

+0

Ok .. будет выглядеть в нем. Просматривая другие вопросы, я нашел эту ссылку, http://stackoverflow.com/questions/16682595/android-volley-imageloader-bitmaplrucache-parameter/16684652#16684652 Могу ли я использовать этот способ для кэширования моих изображений? –

+1

Может быть .. Но это кэширование объясняет кэширование памяти для дискового кэша, вы должны были использовать решение Джейка – Sameer

+0

Okie .. Спасибо за вашу помощь. Будет проверять решение Джейка и вернуться к вам. Upvoted. –

1

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

JakeWharton's DiskLruCache - How to Implement with Volley?

1

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

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

Вот блог, описывающий настройки более подробно: Setting up the Android Google Volley ImageLoader for NetworkImageView

0

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

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

1

Рассмотрите возможность использования Glide, который рекомендует андроид для загрузки изображений в приложение. По сравнению с volley, 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) Glide Использование в деятельности

//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

+0

Glide работает намного лучше и быстрее, чем Volley –