3

私は nostra のUniversal Image Loaderを使用しています。これを使用して、サイズが 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の使用セクションで定義されているすべての構成があります。

4

1 に答える 1

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

この行の画像を追加すると、スクロールしても反映されません。

2つ目は、以下のリンクを確認して
ください 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);

注:上記のコードは単なる提案です。問題が解決するかどうかはわかりません。

于 2014-06-21T05:49:18.180 に答える