简体   繁体   中英

How to wait Picasso to finish load Images in Android?

So, I have an activity, lets say a PetDetailActivity that shows a carousel with some Bitmaps in it (I use com.synnapps:carouselview:0.1.5 to handle my carousel). The problem is that the PetDetailActivity loaded with 0 sized carousel, which maybe the images is still being processed by a thread. How to wait Picasso to finish processing URLs, and then show it up in the new Activity?

This is the code of PetDetailActivity:

import ...
public class PetDetailActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pet_detail);

        Intent i = getIntent();
        Pet targetPet = (Pet)i.getSerializableExtra("PetObject");
        ActionBar actionBar = getSupportActionBar();
        if(actionBar!=null) actionBar.setDisplayHomeAsUpEnabled(true);

        //Creating a BitmapHandler object to download image from URL to Bitmap object using picasso.
        BitmapHandler bitmapHandler = new BitmapHandler(targetPet.getCarouselImageUrl());
        final ArrayList<Bitmap> petCarouselBitmaps = bitmapHandler.getProcessedBitmap();

        //The bitmap is being downloaded in other thread, so the activity is up and 
        //CarouselView is still empty (petCarouselBitmaps.size() == 0)
        //So how to wait the bitmaps is processed, like show a loading screen on the UI?

        CarouselView petCarousel = findViewById(R.id.petCarousel);
        petCarousel.setPageCount(petCarouselBitmaps.size());
        petCarousel.setImageListener(new ImageListener() {
            @Override
            public void setImageForPosition(int position, ImageView imageView) {
                imageView.setImageBitmap(petCarouselBitmaps.get(position));
            }
        });
    }
...
}

And Here is the BitmapHandler Class that downloads image from URL to a Bitmap using picasso:

public class BitmapHandler extends Thread {
    ArrayList<String> urlList;
    private ArrayList<Bitmap> loadedBitmap;

    public BitmapHandler(ArrayList<String> list){
        this.urlList = list;
        this.loadedBitmap = new ArrayList<>();
    }

    public ArrayList<Bitmap> getProcessedBitmap(){
        this.run();
        //Returning the loaded bitmap as a ArrayList<Bitmap> Object.
        return loadedBitmap;
    }

    @Override
    public void run() {
        Target target = new Target() {
            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                loadedBitmap.add(bitmap);
            }
            @Override
            public void onBitmapFailed(Exception e, Drawable errorDrawable) {}
            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {}
        };

        for (String url : urlList) {
            Picasso.get().load(url).into(target);
        }
    }
}

Thank you for any helps!

Problem: . How to wait Picasso to finish processing URLs

Solution:

I think you can go with Target callback:

private Target target = new Target() {
      @Override
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {       
      }
      @Override
      public void onBitmapFailed() {
      }
}

And while loading image, you need to write:

Picasso.with(this).load(myURL).into(target);

Just for the information:

  • onBitmapLoaded() mostly used to perform image operations before we load into the view actually.
  • Picasso.LoadedFrom describes where the image was loaded from, whether it's MEMORY, DISK or NETWORK.

I think you can use placeholder & then the image is loaded it will show in Image View. And if you want to delay use can use Thread.sleep(5000) .

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