我使用Picasso从url加载图像。到目前为止,图像加载对每个图像都有效,直到我尝试使用比其他图像更大的jpeg图像(1MB(。我尝试使用imageTarget加载图像,该图像不应被垃圾收集,因为它声明如下:
fun loadImage(view: ImageView, displayImageUrl: String?) {
val imageTarget: com.squareup.picasso.Target = object : com.squareup.picasso.Target {
override fun onBitmapLoaded(bitmap: Bitmap, loadedFrom: Picasso.LoadedFrom) {
view.setImageBitmap(bitmap)
}
override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?)
}
override fun onPrepareLoad(drawable: Drawable?) {
}
}
}
onBitmapLoaded
不执行,只有onPrepareLoad
执行。下面的Picasso日志说目标是垃圾收集的,但如果执行onPrepareLoad
,这怎么可能呢。此消息是否指从内存中清除的下载图像?该图像是使用Picasso早期加载的列表视图,其中包含图像的缩略图,并且工作良好,因为我可以在列表上看到图像,但当我打开具有图像大视图的屏幕时,它不会加载它。
2022-03-25 10:03:41.462 8949-9021/mobile.debug D/Picasso: Dispatcher enqueued [R5]+2ms
2022-03-25 10:03:41.463 8949-9023/mobile.debug D/Picasso: Hunter executing [R5]+3ms
2022-03-25 10:03:42.386 8949-9023/mobile.debug D/Picasso: Hunter decoded [R5]+925ms
2022-03-25 10:03:42.388 8949-9021/mobile.debug D/Picasso: Dispatcher batched [R5]+927ms for completion
2022-03-25 10:03:42.505 8949-8963/mobile.debug I/ge.mobile.debu: NativeAlloc concurrent copying GC freed 80414(6068KB) AllocSpace objects, 75(1628KB) LOS objects, 49% free, 14MB/28MB, paused 823us total 133.822ms
2022-03-25 10:03:42.523 8949-8949/mobile.debug D/Picasso: Main canceled [R5]+1062ms target got garbage collected
2022-03-25 10:03:42.631 8949-9021/mobile.debug D/Picasso: Dispatcher delivered [R5]+1171ms
2022-03-25 10:03:42.631 8949-8949/mobile.debug D/Picasso: Main completed [R5]+1171ms from DISK
加载图像的调用是简单的Picasso.get().load(displayImageUrl).into(imageTarget)
Picasso确实加载了大于1MB的图像。
Picasso.get().load(url)
.placeholder(R.drawable.gradient_placeholder_horizontal)
.into(image)
不要使用Target。它有时不能正常工作。尤其是从回收商的角度来看。
若要获得位图,请使用。你可以用它来确定尺寸。
Bitmap bitmap = Picasso.get().load(url).get();
您可以使用此调整大小&仅ScaleDown((。只有当缩放比例大于调整中给定的值时,才会调整的大小
Picasso.get().load(url)
.placeholder(R.drawable.gradient_placeholder_horizontal)
.resize(476, 678)
.onlyScaleDown()
.centerCrop()
.into(image)
您应该使用resize来准确加载大小:
Picasso.with(this).load(imageUrl).resize(width, height).into(imageView);
显然,解决方案是使用Picasso.get().load(displayImageUrl)
而不是Target
。不需要调整图像大小。然而,Target
为什么有时会失败的问题仍然没有答案。