我有一个用例,我正在使用毕加索下载照片并将其存储到缓存中。全部下载可能需要一些时间。 因此,我想采取一种变通办法,如果映像不在缓存存储中,然后从网络加载它。
似乎有一些显而易见的解决方案,例如: Load already fetched image when offline in Glide for Android
但是我的用例是我必须将此照片加载到目标(因为加载图像时我应该可以访问位图,以便例如获取其宽度和高度)
这是我下载照片网址并缓存它们的设置:
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()
方法时,直到那时看来似乎工作正常-图像不在缓存中时是从网络下载的