2014-07-22 9 views
16

Voglio onStart() metodo per caricare immagine dal server utilizzando Picasso e voglio mostrare una barra di avanzamento fino a quando le foto sono completamente scaricati Ecco il mio codice:come utilizzare la barra di avanzamento quando si carica l'immagine in Picasso?

@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(); 
     } 
+0

perché devi chiamare 'Picasso' due volte in' onStart'? il tuo 'Picasso' con callback dovrebbe funzionare. – chip

+0

intendi Picasso.with (this) .load (imageLoad) .into (target); – androidAhmed

risposta

16

non ho ancora testato il codice, ma anche se funziona, il file actress_wallpaper.jpg non è caricato in ImageView. Nella documentazione, si dice

oggetti di attuazione di questa categoria devono avere un'implementazione funzionante Object.equals(Object) e Object.hashCode() stoccaggio ordinato internamente.

Prova questo:

File file = new File(pathToFile); 

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

essere avvertito non ho ancora testato il mio codice.

Aggiornamento: la versione 2.3.2 e 2.3.3

ho provato, sembra che ci sia un problema https://github.com/square/picasso/issues/539

+0

il codice funziona nell'immagine di caricamento ma nella barra di avanzamento mostra fino a che il caricamento dell'immagine non ha funzionato – androidAhmed

+0

la richiamata viene attivata dopo che la bitmap è stata caricata nella vista immagine – chip

+0

progressbar funziona bene ma quando tocco lo schermo poi mostro l'immagine –

1

Si tratta di una vecchia questione, ma potrebbe essere questa risposta può aiutare gli altri come Ho anche avuto problemi nel mostrare la barra di avanzamento durante il caricamento dell'immagine dal server.

Sto usando Picasso 2.4.0. e sto usando l'interfaccia Picasso Target per caricare l'immagine in vista di immagini. Ecco il codice testato e funzionante:

Prima aggiungere le seguenti linee:

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

qui è la realizzazione dell'interfaccia bersaglio utilizzata sopra

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

Il codice precedente funziona bene se utilizzata per il carico immagine in attività. Ma se si desidera caricare l'immagine in gridview/recyclerview o view pager ecc. Dove viene utilizzato lo stesso titolare della vista, è possibile ottenere an issue dove onBitmapLoaded() non viene chiamato (poiché la vista viene riciclata e Picasso mantiene solo un riferimento debole alla destinazione oggetto). Ecco a link per risolvere questo problema.

Problemi correlati