ImageView RecyclerView Lazy Load - PullRequest
       47

ImageView RecyclerView Lazy Load

0 голосов
/ 21 ноября 2018

У меня есть RecyclerViewAdapter, который в onBindViewHolder выполняет вызов AsyncTask для загрузки изображения, требуемого из облачного хранилища Google.

В RecyclerViewAdapter есть некоторые элементы, которые вызывают одно и то же изображение.Я пытался справиться с этим, загружая изображение только в том случае, если оно еще не существует в локальном хранилище файлов;в противном случае, если это произойдет, то он использует изображение, которое уже было загружено.

Теперь, что происходит, если есть несколько элементов из RecyclerView, вызывающих одно и то же изображение в достаточно близкое время, один из элементовImageView будет просто пустым / белым, но остальные будут отображать изображение правильно.

Я надеялся, что смогу запечатлеть этот сценарий и просто использовать Thread.sleep, а затем попытаться снова получить / использовать файлно я не получаю никаких исключений или чего-то подобного, поэтому я не уверен, как даже запечатлеть этот сценарий, чтобы справиться с ним.

Единственное, что я вижу в logcat, который выглядит отдаленно полезным, этониже:

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

Однако оно не выдает исключение, оно просто регистрирует его как сообщение.

Однако оно указывает на проблему с декодированиемизображения.Поэтому я проверил документацию BitmapFactory.decodeFile и там написано, что она возвращает ноль, если не может его декодировать.Поэтому я попытался проверить, было ли мое растровое изображение пустым после попытки декодирования, но оно никогда не попадало в этот оператор 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 и как я могу перехватить его, когда оно не удается декодировать, чтобы я мог обработать его?

1 Ответ

0 голосов
/ 21 ноября 2018

Используйте Glide для отображения изображения в recyclerView

Добавьте эти зависимости в build.gradle

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

Внутри onBindViewHolder

Параметр запроса для отображения изображения ошибки, изображения заполнителя и т. Д. 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!!)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...