简体   繁体   中英

Picasso Fetching Images in Activity, then show them into Fragment's ImageView

I am trying to fetch multiple images in an Activity with FragmentStateAdapter in it.

Then I need to show them into some Fragment's ImageView. I want to preload them into the cache ( after I receive an API response with the info about images like imageID's)

Do I need to use do something else after.fetch() in Activity and do I need to create again same URL request and then load it into the right image view?

Currently, I am seeing images normally but I guess that they are not preloaded in Activity and I fetch them in the Fragment. I am not sure, how to check it?

Thank you for your help in advance!

class FavouriteActivity: - here I want to preload them:

    @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?
}

This is my adapter in which I have some fragments (for each image different one)

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)),
//(...)

and Fragment code with images where I need to load already fetched images with 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? 
       )
}

Your code seemed to me ok.

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

I did it like that:

In Activity:

   @Subscribe
   fun onCoolingImageInfoEvent(coolingEvent: FreezerImageEvent?) {
        (...)
        viewModel.shownCoolingImages.forEach {

        picasso
          .load("https://(...)/$applianceID/images/${
            viewModel.getImageIDByIndex(index)
          }")
          .priority(Picasso.Priority.HIGH)
          ?.fetch()
        }
    (...) 
   }

And in fragment:

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")
                        }
                    }); 
            }
        })
}

Take a Note: as @ocos said, you can check if it loads Image from 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM