ImageView RecyclerView延迟加载

时间:2018-11-21 10:11:10

标签: android imageview bitmapfactory recyclerview-layout skia

我有一个RecyclerViewAdapter,在onBindViewHolder中,我进行了AsyncTask调用以从Google Cloud Storage下载所需的图像。

RecyclerViewAdapter中有一些项目需要相同的图像。我试图通过仅下载映像(如果本地文件存储中尚不存在)来解决此问题;否则,它将使用已下载的图像。

现在发生的事情是,如果RecyclerView中有多个项目在足够近的同一时间调用同一张图像,那么ImageView中的一项将只是空白/白色,但是其余项目将正确显示该图像。

我希望能够捕获这种情况,并只使用Thread.sleep然后尝试再次获取/使用该文件,但是我没有抛出任何异常或任何异常,因此我不确定如何甚至捕获该场景以对其进行处理。

在logcat中,唯一可以看到的远程帮助如下:

D/skia: --- Failed to create image decoder with message 'unimplemented'

但是它不会引发异常,而只是将其记录为消息。

但是,它确实指出图像解码存在问题。因此,我检查了BitmapFactory.decodeFile文档,并说如果无法解码,它将返回null。因此,我尝试在尝试解码后检查我的位图是否为空,但是它从未命中该IF语句,这意味着它从未返回空值,所以我不确定该怎么做。

new Getlogos(holder.logoImageView.getTag().toString(), holder.itemView.getContext(), new Getlogos.AsyncResponse() {
    @Override
    public void returnBitmapURI(String URI, String tag) {
        if (holder.logoImageView != null && holder.logoImageView.getTag().toString().equals(tag)) {
            if (URI.contains("drawable://")) {
                int id = Integer.parseInt(URI.substring(11));
                Bitmap myBitmap = BitmapFactory.decodeResource(context.getResources(), id);
                holder.logoImageView.setImageBitmap(myBitmap);
            } else {
                Bitmap myBitmap = BitmapFactory.decodeFile(URI);
                holder.logoImageView.setImageBitmap(myBitmap);
            }
        }
    }
}).execute();

仅在某些情况下会出现此问题,而在同一张图片上不会始终出现该问题。通常,在具有相同图像要下载/使用的某些项目之间,它会有所不同。有时根本不会发生。

任何人都无法阐明该skia消息的来源以及在无法解码时如何捕获它,以便我可以处理吗?

2 个答案:

答案 0 :(得分:3)

  

使用Glide在recyclerView中显示图像

     

将此依赖项添加到build.gradle

implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'

在onBindViewHolder内

  

请求选项以显示错误图像,占位符图像等。   占位符drawable的CircularProgressDrawable(可选)

val circularProgressDrawable = CircularProgressDrawable(mContext)
        circularProgressDrawable.strokeWidth = 5f
        circularProgressDrawable.centerRadius = 30f
        circularProgressDrawable.start()

        val requestOption : RequestOptions = RequestOptions()
                .placeholder(circularProgressDrawable)
                .error(R.drawable.ic_error_1)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .priority(Priority.HIGH)
                .dontAnimate()
                .dontTransform()
  

如下所示初始化Glide

Glide.with(mContext)
            .load(model.imageUrl)
            .apply(requestOption)
            .into(holder.imageView!!)

答案 1 :(得分:0)

如果发生这种情况:

  

无法创建带有消息“未实现”的图像解码器

通过判断“位图==空?”来捕获异常。 类似于以下代码:
enter image description here

我的英语不太好,希望您能理解我说的话!