android - 快速滚动时 Universal Image Loader 崩溃

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

我正在使用 nostra 的 Universal Image Loader ,我正在使用它在 gridview 上加载图像,大小为 100 * 100,但是当在 GridView 中快速滚动时会引发异常(仅用于演示,我在网格适配器上有 13000 个图像),尽管库处理异常并且用户没有收到通知,以下是异常(exception)情况

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();

更新:

Adapter 代码没什么,

imageLoader.displayImage(uriPath, holder.imgThumbnail);

我拥有在 UIL GitHub 的使用部分中定义的所有配置

最佳答案

我最喜欢的图书馆之一,

首先请添加

 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);

注意:以上代码只是建议,不知道能不能解决你的问题。

关于android - 快速滚动时 Universal Image Loader 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18692199/

相关文章:

java - FileInputstream - FileNotFound(进程无法访问文件)。适用于应用断点

android - 如何检查包含字符串的微调器不等于另一个字符串?

android - Unity3D Android构建报告完整尺寸太大

android - 重新签署 Android Apk

android - Android 工具栏上的 GridView 重叠

Android GridView(自定义) fragment 图片,但是打不开页面

android - 使用推送通知 IntentService 中的 GoogleApiClient 将数据发送到 Android Wear

c# - 文件存在时找不到 VirtualFileResult 文件

java - getAssets() 方法中找不到文件异常

java - 尝试使用 Java SDK 将文件放入 AWS Device Farm 时出现 "Invalid application uploaded"