Пикассо показывает неправильное изображение, когда файл не существует в локальном хранилище - PullRequest
0 голосов
/ 11 июня 2019

У меня есть видоискатель, который показывает список пользователей с их аватаром. После входа в систему я загружаю все аватары и сохраняю их локально с именем файла, которое является идентификатором строки пользователя из mongo db. Когда файл аватара недоступен в хранилище, Пикассо загружает аватар другого пользователя случайным образом. Что я должен сделать, чтобы предотвратить это. Это обычный код для отображения или загрузки изображения в случае недоступности

Я пытался использовать политики кэширования в Picasso, но это тоже не сработало.

public ImageUtils loadFromDisk(String id, ImageView target) {
        Log.d(TAG, "loadFromDisk: imageId: " + id);
        File directory = contextWrapper.getDir("avatars", Context.MODE_PRIVATE);
        File avatarPath = new File(directory, id);
        if (avatarPath.exists()) {
            Log.d(TAG, "loadFromDisk: loaded from disk" + avatarPath);
            Picasso.get().load(avatarPath)
                    .memoryPolicy(MemoryPolicy.NO_CACHE)
                    .networkPolicy(NetworkPolicy.NO_CACHE)
                    .into(target);
        } else {
           Picasso.get().load(R.drawable.image_thumb).into(target);
        }
        return this;
    }

Я вызываю loadFromDisk из класса Singleton ImageUtils в классе RecyclerView bindView.

PS: код bindViewHolder

public void onBindViewHolder(@NonNull RecentChatsViewHolder recentChatsViewHolder, int i) {
        Log.d(TAG, "onBindViewHolder: content row");

        if (recentChat.isNew) {
            recentChatsViewHolder.blueDot.setVisibility(View.VISIBLE);
        } else {
            recentChatsViewHolder.blueDot.setVisibility(View.GONE);
        }

        recentChatsViewHolder.avatar.setImageResource(R.drawable.ic_info_outline_white_48dp);
        ImageUtils.getInstance(context).loadFromDisk(recentChat.id, recentChatsViewHolder.avatar); //this calls above function here I don't pass the else condition of above method so there's no race condition 

    }

1 Ответ

0 голосов
/ 11 июня 2019

Так как это внутри recyclerView, я предполагаю, что происходит какое-то состояние гонки.Когда вы звоните FileDownloader, чтобы загрузить изображение.Он загружает изображение и загружает его в цель.Но цель не верна, так как представление рециркулятора теперь прокручивается.

Возможно, этого можно избежать, добавив id в качестве тега к ImageView и отметив тег после загрузки изображения.Если тег отличается, не загружайте изображение в представление.-> Это будет работать только в том случае, если обратный вызов / лямбда-загрузка передает id.

РЕДАКТИРОВАТЬ:

Я не знаю, что происходит с fallback.Было бы лучше, если бы вы могли удалить его из добавленного вами фрагмента.

Я могу предложить 2 вещи.

  1. ImageView.setImageBitmap(null) или попросить Пикассо очистить цель перед загрузкойновое изображение.Если аватар не существует, очистите цель.
  2. Добавьте errorDrawable, поэтому в случае ошибки предыдущее изображение не будет отображаться.
...