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(例如 etagdocument 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