快速滚动时,Universal Image Loader会崩溃

时间:2013-09-09 05:52:30

标签: android android-gridview filenotfoundexception universal-image-loader

我正在使用nostra的Universal Image Loader,我正在使用它来加载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 for disk cache

  4. 使用最新的库1.9.2

  5. 话虽这么说,库崩溃了,不再能够加载图像并重复所有以前的图像,如何在这种情况下重置库并重新开始这样的崩溃?

    以下是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

    中“使用情况”部分中定义的所有配置

1 个答案:

答案 0 :(得分:4)

我最喜欢的图书馆之一,

首先请添加

 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.当用户滚动列表/ gridview时停止加载。

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

注意:以上代码只是建议,我不知道它会解决您的问题。