Сбой универсального загрузчика изображений при быстрой прокрутке

Я использую Universal Image Loader от nostra, я использую его для загрузки изображений на gridview с размером 100 * 100, но возникает исключение, КОГДА очень быстро прокручивается через представление сетки (только для демонстрации, у меня есть 13000 изображений на сетевом адаптере), хотя библиотека обрабатывает исключение, и пользователь не уведомляется об этом, ниже исключение

06-21 11:13:17.748: E/ImageLoader(2070): No such file or directory
06-21 11:13:17.748: E/ImageLoader(2070): java.io.FileNotFoundException: No such file or directory
06-21 11:13:17.748: E/ImageLoader(2070):    at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:145)
06-21 11:13:17.748: E/ImageLoader(2070):    at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:612)
06-21 11:13:17.748: E/ImageLoader(2070):    at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:607)
06-21 11:13:17.748: E/ImageLoader(2070):    at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:536)
06-21 11:13:17.748: E/ImageLoader(2070):    at android.content.ContentResolver.openInputStream(ContentResolver.java:371)
06-21 11:13:17.748: E/ImageLoader(2070):    at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStreamFromContent(BaseImageDownloader.java:177)
06-21 11:13:17.748: E/ImageLoader(2070):    at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStream(BaseImageDownloader.java:88)
06-21 11:13:17.748: E/ImageLoader(2070):    at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.downloadImage(LoadAndDisplayImageTask.java:290)
06-21 11:13:17.748: E/ImageLoader(2070):    at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryCacheImageOnDisk(LoadAndDisplayImageTask.java:273)
06-21 11:13:17.748: E/ImageLoader(2070):    at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:229)
06-21 11:13:17.748: E/ImageLoader(2070):    at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:135)
06-21 11:13:17.748: E/ImageLoader(2070):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
06-21 11:13:17.748: E/ImageLoader(2070):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
06-21 11:13:17.748: E/ImageLoader(2070):    at java.lang.Thread.run(Thread.java:856)

Действующий код:

  1. WRITE_EXTERNAL_STORAGE добавлен

  2. И память, и дисковый кеш

  3. UnlimitedDiskCache для дискового кеша

  4. Использование последней библиотеки 1.9.2

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

Ниже показана конфигурация ImageLoader

String cacheDirectory=context.getCacheDir()+ImageLoaderConstants.IMAGE_CACHE_DIRECTOY_PATH;
        File cacheDir=new File(cacheDirectory);
        DisplayImageOptions options = new DisplayImageOptions.Builder()
        .delayBeforeLoading(0)
        .cacheInMemory(true)
        .cacheOnDisk(true)
        .imageScaleType(ImageScaleType.EXACTLY)
        .bitmapConfig(Bitmap.Config.RGB_565)
        .displayer(new SimpleBitmapDisplayer())
        .build();

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).threadPoolSize(5)
                .threadPriority(Thread.NORM_PRIORITY)
                .denyCacheImageMultipleSizesInMemory()
                .memoryCacheExtraOptions(1280, 720) 
                .diskCacheExtraOptions(1280, 720,null)
                .memoryCache(new LruMemoryCache(5*1024*1024))
                .diskCache(new UnlimitedDiscCache(cacheDir)) 
                .defaultDisplayImageOptions(options)
                .build();

ОБНОВЛЕНИЕ:

В коде адаптера нет ничего особенного,

imageLoader.displayImage(uriPath, holder.imgThumbnail);

У меня есть все конфигурации, как указано в разделе «Использование» на UIL GitHub.


person Akhil Jain    schedule 09.09.2013    source источник
comment
Я рекомендовал использовать структуру androidquery, потому что она обрабатывает даже ошибку нехватки памяти. code.google.com/p/android-query   -  person Biraj Zalavadia    schedule 09.09.2013
comment
В вашей конфигурации активирована опция кэширования памяти?   -  person Nima G    schedule 09.09.2013
comment
@BirajZalavadia это не ошибка OOM   -  person Akhil Jain    schedule 09.09.2013
comment
можешь показать свой код адаптера?   -  person Pork 'n' Bunny    schedule 18.09.2013
comment
@Pork'n'Bunny, это не имеет значения   -  person Akhil Jain    schedule 21.06.2014
comment
@Imtiyaz У меня весь код реализован с использованием универсального, и НЕТ, у меня нет   -  person Akhil Jain    schedule 21.06.2014
comment
@Akhil Jain: перейдите по ссылке Бираджа Залавадии.   -  person Imtiyaz Khalani    schedule 21.06.2014
comment
@Imtiyaz Я знаю, что это такое, я знаю о Picassio и aquery, поскольку у меня уже есть реализация в UIL, я менее готов рассматривать, и в этом доступно множество вариантов настройки, чем в других   -  person Akhil Jain    schedule 21.06.2014
comment
Я использую Picassio, но универсальный загрузчик изображений эффективнее и быстрее, чем любой другой.   -  person Bhavesh Jethani    schedule 21.06.2014
comment
@AkhilJain Пожалуйста, покажите код getView() вашего адаптера. Включите ведение журнала отладки в конфигурации и покажите журналы ImageLoader после сбоя. Также добавьте resetViewBeforeLoading(true) в параметры отображения.   -  person nostra13    schedule 21.06.2014
comment
@NOSTRA в коде адаптера нет ничего особенного, я добавляю только соответствующий код. ПОСМОТРЕТЬ КОД ОБНОВЛЕНИЯ, когда установите изображение в представление, хорошо, я добавлю resetViewBeforeLoading(true)   -  person Akhil Jain    schedule 21.06.2014
comment
Вы пытались показать изображение большого пальца вашего исходного изображения?   -  person Haresh Chhelana    schedule 26.06.2014
comment
@Haresh да, много раз случается, что пользователь очищает кеш большого пальца или миниатюра еще не создана для этого конкретного файла / изображения, и в это время это становится проблемой, поскольку файл / uri не найден.   -  person Akhil Jain    schedule 26.06.2014
comment
пожалуйста, опубликуйте свой код ... код адаптера ....... вся деятельность также ......   -  person Bhavesh Jethani    schedule 30.06.2014


Ответы (1)


Одна из моих любимых библиотек,

в первую очередь добавьте пожалуйста

 DisplayImageOptions options = new DisplayImageOptions.Builder()
        .delayBeforeLoading(0)
        .cacheInMemory(true)
        .cacheOnDisk(true)
         .resetViewBeforeLoading(true) // add this line
        .imageScaleType(ImageScaleType.EXACTLY)
        .bitmapConfig(Bitmap.Config.RGB_565)
        .displayer(new SimpleBitmapDisplayer())
        .build();

добавив эту строку, изображение не будет преломляться при прокрутке.

и во-вторых, проверьте ссылки ниже
https://github.com/nostra13/Android-Universal-Image-Loader#useful-info

в этой ссылке прочитайте пункт № 8. остановить загрузку, когда пользователь прокручивает список/сетку.

boolean pauseOnScroll = false; // or true
boolean pauseOnFling = true; // or false
PauseOnScrollListener listener = new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling);
listView.setOnScrollListener(listener);

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

person Bhavesh Jethani    schedule 21.06.2014