web-dev-qa-db-fra.com

comment utiliser la barre de progression lors du chargement de l'image dans picasso?

Je souhaite que la méthode onStart() charge l'image à partir du serveur à l'aide de picasso et je souhaite afficher une barre de progression jusqu'à ce que les photos soient entièrement téléchargées. Voici mon code:

@Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();

        Picasso.with(context).load(imageLoad)
                .placeholder(R.id.progressBarDetails)
                .error(R.drawable.friend_request).noFade().resize(200, 200)
                .into(avatarImage, new Callback() {
                    @Override
                    public void onError() {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onSuccess() {
                        // TODO Auto-generated method stub
                        progressbar.setVisibility(View.GONE);
                    }

                });

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

    }

    OnFinished a = new OnFinished() {

        @Override
        public void onSendFinished(IntentSender IntentSender, Intent intent,
                int resultCode, String resultData, Bundle resultExtras) {
            // TODO Auto-generated method stub
            intent = new Intent(getApplicationContext(), Map.class);
        }
    };

    private Target target = new Target() {
        @Override
        public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    File file = new File(Environment
                            .getExternalStorageDirectory().getPath()
                            + "/actress_wallpaper.jpg");
                    try {
                        file.createNewFile();
                        FileOutputStream ostream = new FileOutputStream(file);
                        bitmap.compress(CompressFormat.JPEG, 75, ostream);
                        ostream.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
            }).start();
        }
19
androidAhmed

Je n'ai pas testé votre code mais même si cela fonctionne, le fichier actress_wallpaper.jpg N'est pas chargé dans ImageView. Dans les documents, il est dit

Les objets implémentant cette classe doivent avoir une implémentation fonctionnelle de Object.equals(Object) et Object.hashCode() pour un stockage correct en interne.

Essaye ça:

File file = new File(pathToFile);

Picasso.with(context)
       .load(file)
       .into(imageView, new Callback() {
           @Override
           public void onSuccess() {
               progressbar.setVisibility(View.GONE);
           }
       });

soyez averti que je n'ai pas testé mon code.

Mise à jour:

J'ai essayé les versions 2.3.2 et 2.3.3, il semble qu'il y ait un problème https://github.com/square/picasso/issues/539

19
chip

C'est une vieille question, mais cette réponse peut aider les autres, car j'ai également eu des problèmes pour afficher la barre de progression lors du chargement de l'image à partir du serveur.

J'utilise Picasso 2.4.0. et j'utilise Picasso Target interface pour charger l'image dans imageview. Voici le code testé et fonctionnel:

Ajoutez d'abord les lignes suivantes:

ImageView ivPhoto = (ImageView) findViewById(R.id.iv_photo);
ProgressBar pbLoadingBar = (ProgressBar) findViewById(R.id.pb_loading_bar);

//get image url
String imageUrl = getImageUrl();

//ImageViewTarget is the implementation of Target interface.
//code for this ImageViewTarget is in the end
Target target = new ImageViewTarget(ivPhoto, pbLoadingBar);
Picasso.with(mContext)
            .load(imageUrl)
            .placeholder(R.drawable.place_holder)
            .error(R.drawable.error_drawable)
            .into(target);

Voici l'implémentation de l'interface Target utilisée ci-dessus

private static class ImageViewTarget implements Target {

    private WeakReference<ImageView> mImageViewReference;
    private WeakReference<ProgressBar> mProgressBarReference;

    public ImageViewTarget(ImageView imageView, ProgressBar progressBar) {
        this.mImageViewReference = new WeakReference<>(imageView);
        this.mProgressBarReference = new WeakReference<>(progressBar);
    }

    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {

        //you can use this bitmap to load image in image view or save it in image file like the one in the above question.
        ImageView imageView = mImageViewReference.get();
        if (imageView != null) {
            imageView.setImageBitmap(bitmap);
        }

        ProgressBar progressBar = mProgressBarReference.get();
        if (progressBar != null) {
            progressBar.setVisibility(View.GONE);
        }
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {
        ImageView imageView = mImageViewReference.get();
        if (imageView != null) {
            imageView.setImageDrawable(errorDrawable);
        }

        ProgressBar progressBar = mProgressBarReference.get();
        if (progressBar != null) {
            progressBar.setVisibility(View.GONE);
        }
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {
        ImageView imageView = mImageViewReference.get();
        if (imageView != null) {
            imageView.setImageDrawable(placeHolderDrawable);
        }

        ProgressBar progressBar = mProgressBarReference.get();
        if (progressBar != null) {
            progressBar.setVisibility(View.VISIBLE);
        }
    }
}

Le code ci-dessus fonctionne correctement s'il est utilisé pour charger l'image en activité. Mais si vous voulez charger l'image dans gridview/recyclerview ou voir pager etc. où le même support de vue est utilisé, vous pourriez obtenir n problème où onBitmapLoaded () n'est pas appelé (car la vue est recyclée et Picasso ne conserve qu'une faible référence à l'objet Cible). Voici n lien pour résoudre ce problème.

3
Ankit Aggarwal