UIL - ImageAware被重复使用于另一张图片。任务被取消。

3

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

你有没有针对这个问题的解决方案? - Akbari Dipali
不,我退出这个项目。据我记得,我用这个替换了UIL:https://github.com/yangfuhai/afinal - ductran
4个回答

4

我也遇到过这个问题。经过多次搜索和尝试,我仍然找不到原因。有时候我认为这个问题可能是由于布局而引起的,所以我进行了检查:

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

1

我对这个库很陌生,但我认为问题出在这一行:

ImageLoaderConfiguration config.denyCacheImageMultipleSizesInMemory()

我相信这可以确保每个图像URI在内存中只缓存一个大小。因此,详细版本必须重新加载。
另外,当调用详细视图时,您是否取消了其余的缩略图任务/加载?如果没有,那么它们仍然在堆栈中。
编辑:某些API细节已过时,但您可以查看配置文档-http://www.intexsoft.com/blog/item/72-universal-image-loader-part-2.html

0

日志中的消息涉及列表视图图像。您的详细页面图像加载时间较长的原因可能与DisplayImageOptions中设置的延迟有关。

.delayBeforeLoading(1000)

你正在使用默认配置吗?


我没有为选项设置延迟。请查看我的更新问题。 - ductran
你尝试过在DisplayImageOptions中添加.delayBeforeLoading(0)吗? - Bms270
你能提供加载详细列表视图的适配器代码吗? - Bms270

0
如果你不想让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();

现在,在您的实际图像加载之前,它将不会显示另一张随机图像。
来源:根据我的个人经验。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接