Picassso - изображение показывается с большой задержкой при использовании кэша (даже при принудительной загрузке из сети) - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть сценарий использования: я загружаю фотографии с помощью Picasso и сохраняю их в кэш.Чтобы загрузить их все, может потребоваться некоторое время.Поэтому я хочу обойти эту проблему, если изображение еще не находится в кэш-памяти, а затем загрузить его из сети.

Кажется, что есть некоторые очевидные решения, такие как, например, здесь: Загрузка уже извлеченного изображения, когдав автономном режиме в Glide для Android

Однако мой вариант использования заключается в том, что я должен загрузить эту фотографию в целевую папку (поскольку у меня должен быть доступ к растровому изображению при загрузке изображения, чтобы я мог, например, получить его ширинуи высота)

Итак, вот мои настройки для загрузки URL-адресов фотографий и их кэширования:

 private fun syncPhotos(urls: List<String>): Completable {
    return Completable.create { emitter ->
      if (urls.isEmpty()) {
        emitter.onComplete()
      } else {
        val picasso = Picasso.get()
        val counter = AtomicInteger(urls.size)
        for (url in urls) {
          picasso.load(url).fetch(object : Callback {
            override fun onSuccess() {
              Timber.d("Photo caching success (counter=$counter)")
              if (counter.decrementAndGet() == 0) {
                emitter.onComplete()
              }
            }

            override fun onError(e: Exception?) {
              Timber.e(e, "Photo caching error (counter=$counter)")
              if (counter.decrementAndGet() == 0) {
                emitter.onComplete()
              }
            }
          })
        }
      }
    }
  }

А затем я просто хочу загрузить несколько фотографий в свою активность и загрузить их в целевой объект:

    Picasso.get()
        .load(photoId)
        .into(photoTarget)

Вот мой photoTarget

  private var photoTarget: Target = object : Target {
    override fun onPrepareLoad(placeHolderDrawable: Drawable?) {

    }

    override fun onBitmapFailed(ex: Exception, errorDrawable: Drawable?) {

    }

    override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) {
     //do some staff with loaded bitmap like ex. set the ImageView using setImageBitmap()
    }
  }

Проблема в том, что фотография не показывается в первый раз - она ​​отображается с большой задержкой, как если бы она ожидалабыть загруженным из предыдущей функции fetch() из кэша.Я даже пытался принудительно загрузить его из сети в первый раз, используя:

  Picasso.get()
        .load(photoId)
        .networkPolicy(NetworkPolicy.NO_CACHE)
        .into(photoTarget)

Но все равно кажется, что загрузка из кэша (огромная задержка, а затем показать)

Что можетрешить эту проблему?

ПРИМЕЧАНИЕ: я пытался сделать:

.resize() 

при использовании метода fetch() и только тогда, кажется, работает правильно - изображение было загружено ссеть, когда ее не было в кеше

...