【问题标题】:UIL - ImageAware is reused for another image. Task is cancelledUIL - ImageAware 被重新用于另一个图像。任务被取消
【发布时间】:2013-12-12 07:56:04
【问题描述】:

首先,我有一个适配器,它使用Universal Image Loader 库来获取每个项目的缩略图。它看起来像这样:

public View getView(int position, View convertView, ViewGroup parent) {
 ViewHolder viewHolder;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.page_edit_item, null);
        viewHolder = new ViewHolder();
        viewHolder.thumbnailImageView= (ImageView) convertView.findViewById(R.id.imgPageData);
                 viewHolder.progressBar =(ProgressBar) convertView.findViewById(R.id.photo_upload_progress_view);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

     viewHolder.progressBar.setVisibility(View.VISIBLE);
     String photoPath = getItem(position).getPhoto();
     ImageLoader.getInstance().displayImage(photoPath, viewHolder.thumbnailImageView, new SimpleImageLoadingListener(){
            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                progressBar.setVisibility(View.GONE);
            }
        });
}

当点击列表视图项目时,它会移动到详细信息屏幕活动。在此屏幕中,我尝试获取详细图像(与所选项目具有相同的图像 url)。

     ImageLoader.getInstance().displayImage(photoPath, detailImageView);

问题是当我选择一个下载图像的项目时(它已加载并显示在列表视图中),但详细信息屏幕不会立即显示此图像,它仍然是黑色并等待适配器列表视图中的所有项目完成加载和显示,然后就可以显示了。
从 logcat 中,我可以在进入详细信息屏幕时看到这一行:

ImageAware is reused for another image. Task is cancelled

有什么想法吗?

更新:这是我的 UIL 配置

  DisplayImageOptions options = new DisplayImageOptions.Builder()
            .resetViewBeforeLoading(true)
            .cacheInMemory(true)
            .cacheOnDisc(true)
            .bitmapConfig(Bitmap.Config.RGB_565) // default
            .displayer(new SimpleBitmapDisplayer())
            .build();
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
            .memoryCacheExtraOptions(1024, 768)
            .discCacheExtraOptions(1024, 768, CompressFormat.JPEG, 75, null)
            .taskExecutor(getThreadPool())
            .taskExecutorForCachedImages(getThreadPool())
            .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // default
            .discCache(new LimitedAgeDiscCache(cacheDir, 3600 * 24 * 7)) // default
            .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
            .imageDownloader(new BaseImageDownloader(getApplicationContext())) // default
            .defaultDisplayImageOptions(options) // default
            .denyCacheImageMultipleSizesInMemory()
            .writeDebugLogs()
            .build();
    ImageLoader.getInstance().init(config);

【问题讨论】:

  • 你有解决这个问题的办法吗?
  • 不,我退出了这个项目。我记得,我用这个替换了 UIL:github.com/yangfuhai/afinal

标签: android android-listview universal-image-loader


【解决方案1】:

我也遇到过这个问题。经过多次搜索和尝试,我仍然找不到原因。偶尔想了一下可能是布局的问题,于是查了一下:

<ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

</ListView>

然后我将 listView 的 layout_height 从“wrap_content”更改为“match_parent”,问题解决了!

<ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

</ListView>

【讨论】:

    【解决方案2】:

    我是这个库的新手,但我认为问题出在这一行:

    ImageLoaderConfiguration config.denyCacheImageMultipleSizesInMemory()
    

    我相信这可以确保对于每个图像 uri,内存中只会缓存一个大小。所以必须重新加载详细版本。

    此外,您是否会在调用详细视图后取消剩余的缩略图任务/加载?如果没有,那么它们仍在堆栈中。

    编辑:一些 API 详细信息已过时,但您可以查看配置文档 -http://www.intexsoft.com/blog/item/72-universal-image-loader-part-2.html

    【讨论】:

      【解决方案3】:

      日志中的消息是指列表视图图像。详情页图片加载时间较长的原因可能与 DisplayImageOptions 中设置的延迟有关

      .delayBeforeLoading(1000)
      

      您使用的是默认配置吗?

      【讨论】:

      • 我没有为选项设置延迟。请看看我更新的问题。
      • 您是否尝试将 .delayBeforeLoading(0) 添加到 DisplayImageOptions?
      • 能否提供加载详细列表视图的适配器代码?
      【解决方案4】:

      如果您不希望 imageLoader 重复使用另一个图像,请使用“resetViewBeforeLoading(true)”

         DisplayImageOptions defaultOptions;
      
         defaultOptions = new DisplayImageOptions.Builder()
                      .resetViewBeforeLoading(true)
                      .displayer(new FadeInBitmapDisplayer(700))
                      .cacheOnDisk(true)
                      .cacheInMemory(true)
                      .bitmapConfig(Bitmap.Config.RGB_565)
                      .build();
      

      现在它不会在您的实际图像加载之前显示另一个随机图像。

      src:- 根据我自己的经验

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-12
        • 2019-01-03
        相关资源
        最近更新 更多