我有一个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消息的来源以及在无法解码时如何捕获它,以便我可以处理吗?
答案 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)
如果发生这种情况:
无法创建带有消息“未实现”的图像解码器
通过判断“位图==空?”来捕获异常。
类似于以下代码:
我的英语不太好,希望您能理解我说的话!