每当在base64图像的recyclerview中调用notifydatasetchanged()时,图像就会闪烁

时间:2019-03-29 07:53:06

标签: android android-recyclerview base64 android-glide

我在项目中使用滑行以在回收站视图中显示图像。该图像将从服务器上下载,直到显示非常低分辨率的模糊图像为止。模糊图像是基于64位编码的图像,它将转换为byteArray以滑动显示。

我的问题是每次调用notifydatasetchanged()函数时,base 64解码图像都会闪烁。如何避免这种奇怪的行为?

我正在同一回收者视图中以文件的形式从本地存储中加载图像,但是调用notifydatasetchanged()时没有闪烁问题。 仅对于模糊图像(基于64位解码的位图)出现闪烁问题

我正在使用滑行版本:4.8.0

//converting string to byteArray
byte[] blurImg = getBlurImageBitmap(fileDataTable.get("blurimg") as String)

//function which converts the image string to byteArray
fun getBlurImageBitmap(blurImageString : String) : ByteArray {
    val decodedBytes = Base64.decode(blurImageString, android.util.Base64.DEFAULT)
    return decodedBytes
}

//loading the byteArray into glide
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    Glide.with(imageMessage.context)
         .load(chatMessage.fileData.blurImg)
         .transition(DrawableTransitionOptions.withCrossFade(1))
         .into(imageMessage)
}

我想避免基数为64的图像闪烁。

1 个答案:

答案 0 :(得分:0)

找到导致图像闪烁的原因。

发现只有base 64(模糊图像)编码的图像会导致闪烁问题,并且本地存储中的图像不会闪烁。 每次刷新数据时,Glide都会将base 64编码的字符串转换为可绘制的字符串,因此会发生闪烁。第一次处理本地存储中的位图并将其存储在LRU缓存中时,因此再次刷新数据时不会加载该位图。

在查看滑动内部回调时,发现只要将基64字符串转换为可绘制对象,它将发送null作为资源。

解决方案是为占位符drawable提供与base 64解码后的drawable相同的滑动,以便每当它发送null作为资源时,它将显示该占位符drawable。

Drawable image = new BitmapDrawable(((ImageViewHolder) holder).imageView.getContext().getResources(), BitmapFactory.decodeByteArray(imgList.get(position), 0, imgList.get(position).length));

//Passing the converted drawable as placeholder
requestOptions.placeholder(image);


Glide.with(imageViewHolder.imageView.getContext())
               .load(imgList.get(position))  -> Passing the same base 64 string which was converted to drawable for placeholder
               .apply(requestOptions)
               .into(imageViewHolder.imageView);


So the image actually flickers but we have passed the same image as placeholder, so the flicker will not be visible to use