【问题标题】:Android Universal ImageLoader in ListView scrolling very slowListView中的Android Universal ImageLoader滚动非常慢
【发布时间】:2014-09-09 06:02:47
【问题描述】:

我有一个 ListView,其中包含具有不同数量图像的项目。每个项目都被放入具有水平 LinearLayout 的 Horizo​​ntalScrollView 中,我将 ImageViews 动态添加到 LinearLayout 中。

我使用Android-Universal-Image-Loader 从本地 sdcard 异步加载图像。我在自定义Application类的onCreate方法中设置了ImageLoaderConfiguration:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
        .threadPriority(Thread.NORM_PRIORITY - 2)
        .denyCacheImageMultipleSizesInMemory()
        .diskCacheFileNameGenerator(new Md5FileNameGenerator())
        .diskCacheSize(200 * 1024 * 1024) // 200 Mb
        .tasksProcessingOrder(QueueProcessingType.LIFO)
        .writeDebugLogs() // Remove for release app
        .build();
ImageLoader.getInstance().init(config);

并在Adapter类的构造方法中设置DisplayImageOptions:

options = new DisplayImageOptions.Builder()
        .showImageOnLoading(R.drawable.ic_loading)
        .showImageForEmptyUri(R.drawable.ic_loading_failed)
        .showImageOnFail(R.drawable.ic_loading_failed)
        .cacheInMemory(true)
        .cacheOnDisk(true)
        .considerExifParams(true)
        .build();

我在 getView 方法中动态加载图像:

ImageLoader.getInstance().displayImage(imageURI, imageView, options);

我的问题是,当我滚动 ListView 时,图像重新加载会很慢,实际上与第一次加载的速度差不多。而且似乎每个图像都是从磁盘重新加载而没有缓存。

PS:我的图片主要是从相机拍摄的,大小约为 2MB ~ 3MB。不知道是不是原图太大了。

感谢您的建议!

【问题讨论】:

  • 在您的DisplayImageOptions 中尝试.resetViewBeforeLoading(true)。您也可以通过.delayBeforeLoading(100) 查询
  • 您是否授予权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  • 尝试使用 AndroidQuery 代替 Universal Image-Loader AndroidQuery : code.google.com/p/android-query
  • @Chirag Jain 我有权限。我可以看到 ImageLoader 的日志:在内存中缓存图像 [file:///....jpg_1080x1800],但是如果我去那个目录我看不到缓存文件。我没有收到指示缓存是否失败的警告消息。
  • @Skynet 我尝试了 .resetViewBeforeLoading(true) 但仍然重新加载非常慢。谢谢。

标签: android universal-image-loader


【解决方案1】:

发现发生了什么。

简而言之:缓存的图片太大。

我使用了 ImageView: [wrap_content, match_parent] 的相对大小,而不是设置固定大小。因此,ImageLoader 缓存了我在日志中看到的所有图像的最大可能大小,即我的设备大小:1080x1800。而且这也非常大,会导致重新加载缓慢。

解决它:

设置 ImageView 的固定大小。或者,如果您不想这样做,请设置 ImageView 的最大可能宽度和高度。设置最大高度后,我的图像被缓存为 250x250,加载延迟几乎消失了。

更多信息请参见Useful Info

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多