Изображение мигает всякий раз, когда notifydatasetchanged () вызывается в программе повторного просмотра для изображения base64 - PullRequest
0 голосов
/ 29 марта 2019

Я использую glide в своем проекте, чтобы показывать изображения в режиме рециркуляции.Изображение будет загружаться с сервера, пока я не покажу размытое изображение с очень низким разрешением.Размытое изображение - это кодированное в Base 64 изображение, которое будет преобразовано в byteArray для показа в глиссаде.

Моя проблема заключается в том, что каждый раз, когда вызывается функция notifydatasetchanged(), мигает декодированное изображение base 64.Как избежать этого странного поведения?

Я загружаю изображения из локального хранилища как Файл в том же представлении утилиты, но при вызове notifydatasetchanged() проблем с миганием не возникает.Только для размытого изображения (растровое растровое изображение в формате 64) возникает проблема с миганием

Я использую версию Glide: 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)
}

Я хочу избежать мерцания изображений Base 64 в Glide.

1 Ответ

0 голосов
/ 30 марта 2019

Обнаружена причина мигания изображения.

Обнаружено, что только изображение в кодировке Base 64 (размытое изображение) вызывает проблему мерцания, и изображение из локального хранилища не мерцает.Glide преобразует строку, закодированную в формате base64, в форму для рисования каждый раз, когда обновляются данные, поэтому происходит мигание.Хотя растровое изображение из локального хранилища обрабатывается впервые и сохраняется в LRU Cache, оно не будет загружено при повторном обновлении данных.

При просмотре внутренних обратных вызовов было обнаружено, что оно отправляет ноль в видересурсом всякий раз, когда он преобразует строку base 64 в drawable.

Решение состоит в том, чтобы дать заполнителю, который можно рисовать, так же, как и base 64, декодированному drawable, чтобы скользить, чтобы он отображал этот заполнитель 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
...