UIL - ImageAware重用于另一个图像。任务已取消

时间:2013-12-12 07:56:05

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

首先,我有一个适配器,它使用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);
            }
        });
}

点击listview项目时,会移至详细屏幕活动。在此屏幕中,我尝试获取详细图像(与所选项目具有相同的图像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);

4 个答案:

答案 0 :(得分:4)

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

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

</ListView>

然后我从&#34; wrap_content&#34;更改listView&#39;的layout_height to&#34; match_parent&#34;,问题解决了!

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

</ListView>

答案 1 :(得分:1)

我是这个图书馆的新手,但我认为问题在于这一行:

ImageLoaderConfiguration config.denyCacheImageMultipleSizesInMemory()

我相信确保每个图像uri只有一个大小缓存在内存中。所以详细版本必须重新加载。

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

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

答案 2 :(得分:0)

日志中的消息是指列表视图图像。您的详细信息页面图像加载时间较长的原因可能与DisplayImageOptions

中设置的延迟有关
.delayBeforeLoading(1000)

您使用的是默认配置吗?

答案 3 :(得分:0)

如果您不希望imageLoader重复使用其他图像,请使用&#34; resetViewBeforeLoading(true)&#34;

   DisplayImageOptions defaultOptions;

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

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

src: - 根据我自己的经验