У меня есть сценарий использования: я загружаю фотографии с помощью 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()
и только тогда, кажется, работает правильно - изображение было загружено ссеть, когда ее не было в кеше