Picasso 在 Activity 中获取图像,然后将它们显示到 Fragment 的 ImageView 中
Picasso Fetching Images in Activity, then show them into Fragment's ImageView
我正在尝试在 Activity 中获取多个图像,其中包含 FragmentStateAdapter。
然后我需要将它们显示到一些 Fragment 的 ImageView 中。
我想将它们预加载到缓存中(在我收到 API 响应后,其中包含有关图像 ID 等图像的信息)
我是否需要在 Activity 中的 .fetch() 之后执行其他操作,我是否需要再次创建相同的 URL 请求,然后将其加载到正确的图像视图中?
目前,我能正常看到图像,但我猜它们没有预加载到 Activity 中,我在片段中获取它们。我不确定,如何检查?
提前感谢您的帮助!
class 最喜欢的Activity: - 这里我想预加载它们:
@Subscribe
fun onCoolingImageInfoEvent(coolingEvent: FreezerImageEvent) {
viewModel.retrieveCoolingImage(coolingEvent.data)
val applianceID = viewModel.haID
viewModel.shownCoolingImages.value?.forEach {
picasso.load("https:/.../api/$applianceID/images/${it.imagekey}")
?.fetch() // does I need to do something else?
}
这是我的适配器,其中有一些片段(每个图像都有不同的片段)
class FavouriteAdapter(
activity: BaseWearActivity,
private val viewModel: FavouriteViewModel
) : FragmentStateAdapter(activity) {
enum class FavouriteFragmentsEnum(
val position: Int,
val fragment: Fragment
) {
FAVOURITES(0, FavouritesFragment()),
COOLING_IMAGE(1, CoolingImageFragment(imageIndex = 0)),
COOLING_IMAGE_2(2, CoolingImageFragment(imageIndex = 1)),
//(...)
和带有图像的片段代码,我需要在其中加载已使用 Picaso 获取的图像
private fun initPicassoImage(coolingImageData: List<CoolingImageData>) {
applianceID = viewModel.haID
imageID = viewModel.getImageIDByIndex(imageIndex)
picasso.load("https:/.../api/$applianceID/images/$imageID")
?.into(current_image, object : Callback {
// (...)
} // does I need to do something else?
)
}
我觉得你的代码没问题。
但是,您正在从服务器获取图像。每当您的服务器更改 http headers
(例如 etag
、document size
等)时,Picasso 可能会使 URL 的缓存在将来针对 URL.
您可以使用 picasso.setIndicatorsEnabled(true)
查看图像是否从缓存中加载。这会在图片的左上角添加一个小指示器。
Color
Picasso loaded from
Red
Network
Green
Memory
Blue
Disk
我是这样做的:
在Activity中:
@Subscribe
fun onCoolingImageInfoEvent(coolingEvent: FreezerImageEvent?) {
(...)
viewModel.shownCoolingImages.forEach {
picasso
.load("https://(...)/$applianceID/images/${
viewModel.getImageIDByIndex(index)
}")
.priority(Picasso.Priority.HIGH)
?.fetch()
}
(...)
}
在片段中:
private fun initPicassoImage() {
(...)
val imageUrl = "https://(...)/$applianceID/images/$imageID"
picasso
.load(imageUrl)
.networkPolicy(NetworkPolicy.OFFLINE)
.into(current_image, object : Callback {
override fun onSuccess() {
Log.d("PICASSO", "success load image from memory")
}
override fun onError(e: Exception?) {
//Try again online if cache failed
picasso
.load(imageUrl)
.into(current_image, object : Callback {
override fun onSuccess() {
Log.d("PICASSO", "load image from network")
}
override fun onError(e: Exception?) {
Log.e("Picasso", "Could not fetch image")
}
});
}
})
}
注意:正如@ocos 所说,您可以检查它是否从 Memory/Network.
加载图像
However, you are fetching images from your server. Picasso may
invalidate the cache for that URL whenever your server change http headers
such as etag
, document size
, etc in future for that URL.
You may use picasso.setIndicatorsEnabled(true)
to see if an image
loaded from cache. This adds a little indicator at top left of your
image.
Color
Picasso loaded from
Red
Network
Green
Memory
Blue
Disk
我正在尝试在 Activity 中获取多个图像,其中包含 FragmentStateAdapter。
然后我需要将它们显示到一些 Fragment 的 ImageView 中。 我想将它们预加载到缓存中(在我收到 API 响应后,其中包含有关图像 ID 等图像的信息)
我是否需要在 Activity 中的 .fetch() 之后执行其他操作,我是否需要再次创建相同的 URL 请求,然后将其加载到正确的图像视图中?
目前,我能正常看到图像,但我猜它们没有预加载到 Activity 中,我在片段中获取它们。我不确定,如何检查?
提前感谢您的帮助!
class 最喜欢的Activity: - 这里我想预加载它们:
@Subscribe
fun onCoolingImageInfoEvent(coolingEvent: FreezerImageEvent) {
viewModel.retrieveCoolingImage(coolingEvent.data)
val applianceID = viewModel.haID
viewModel.shownCoolingImages.value?.forEach {
picasso.load("https:/.../api/$applianceID/images/${it.imagekey}")
?.fetch() // does I need to do something else?
}
这是我的适配器,其中有一些片段(每个图像都有不同的片段)
class FavouriteAdapter(
activity: BaseWearActivity,
private val viewModel: FavouriteViewModel
) : FragmentStateAdapter(activity) {
enum class FavouriteFragmentsEnum(
val position: Int,
val fragment: Fragment
) {
FAVOURITES(0, FavouritesFragment()),
COOLING_IMAGE(1, CoolingImageFragment(imageIndex = 0)),
COOLING_IMAGE_2(2, CoolingImageFragment(imageIndex = 1)),
//(...)
和带有图像的片段代码,我需要在其中加载已使用 Picaso 获取的图像
private fun initPicassoImage(coolingImageData: List<CoolingImageData>) {
applianceID = viewModel.haID
imageID = viewModel.getImageIDByIndex(imageIndex)
picasso.load("https:/.../api/$applianceID/images/$imageID")
?.into(current_image, object : Callback {
// (...)
} // does I need to do something else?
)
}
我觉得你的代码没问题。
但是,您正在从服务器获取图像。每当您的服务器更改 http headers
(例如 etag
、document size
等)时,Picasso 可能会使 URL 的缓存在将来针对 URL.
您可以使用 picasso.setIndicatorsEnabled(true)
查看图像是否从缓存中加载。这会在图片的左上角添加一个小指示器。
Color | Picasso loaded from |
---|---|
Red | Network |
Green | Memory |
Blue | Disk |
我是这样做的:
在Activity中:
@Subscribe
fun onCoolingImageInfoEvent(coolingEvent: FreezerImageEvent?) {
(...)
viewModel.shownCoolingImages.forEach {
picasso
.load("https://(...)/$applianceID/images/${
viewModel.getImageIDByIndex(index)
}")
.priority(Picasso.Priority.HIGH)
?.fetch()
}
(...)
}
在片段中:
private fun initPicassoImage() {
(...)
val imageUrl = "https://(...)/$applianceID/images/$imageID"
picasso
.load(imageUrl)
.networkPolicy(NetworkPolicy.OFFLINE)
.into(current_image, object : Callback {
override fun onSuccess() {
Log.d("PICASSO", "success load image from memory")
}
override fun onError(e: Exception?) {
//Try again online if cache failed
picasso
.load(imageUrl)
.into(current_image, object : Callback {
override fun onSuccess() {
Log.d("PICASSO", "load image from network")
}
override fun onError(e: Exception?) {
Log.e("Picasso", "Could not fetch image")
}
});
}
})
}
注意:正如@ocos 所说,您可以检查它是否从 Memory/Network.
加载图像However, you are fetching images from your server. Picasso may invalidate the cache for that URL whenever your server change
http headers
such asetag
,document size
, etc in future for that URL.You may use
picasso.setIndicatorsEnabled(true)
to see if an image loaded from cache. This adds a little indicator at top left of your image.
Color | Picasso loaded from |
---|---|
Red | Network |
Green | Memory |
Blue | Disk |