2014-09-22 10 views
5

Ho lo stesso problema, che voglio usare i drawable generati da Picasso per Image Caching Purpose, ma non riesco a ottenere lo stesso. Ecco il codice che sto usando per accedere alle drawable Bitmap:Picasso onBitmapLoaded mai chiamato

Target targetBitmap = new Target() { 

      @Override 
      public void onPrepareLoad(Drawable arg0) { 

      } 

      @Override 
      public void onBitmapLoaded(Bitmap arg0, Picasso.LoadedFrom arg1) { 
       mBitmap = arg0; 
       BitmapDrawable d = new BitmapDrawable(context.getResources(), arg0); 

       int margin = 2; 
       int border = 0; 

       Rect r = new Rect(margin, margin, width - margin, height - margin); 

       int imageWidth = r.width(); 
       int imageHeight = r.height(); 

       if (imageHeight > r.height() - (border * 2)) { 
        imageHeight = r.height() - (border * 2); 
       } 

       r.left += ((r.width() - imageWidth)/2) - border; 
       r.right = r.left + imageWidth + border + border; 
       r.top += ((r.height() - imageHeight)/2) + border; 
       r.bottom = r.top + imageHeight + border + border; 

       Paint p = new Paint(); 
       p.setColor(0xFFFFFF); 

       c.drawRect(r, p); 
       r.left += border; 
       r.right -= border; 
       r.top += border; 
       r.bottom -= border; 
       d.setBounds(r); 
       d.draw(c); 
      } 

      @Override 
      public void onBitmapFailed(Drawable arg0) { 

      } 
     }; 

     Picasso.with(context).load(app.getListBookDetails().get(img_num).getImage_150x225()).into(targetBitmap); 

Ma qui onBitmapLoaded metodo non viene mai chiamato. Come posso accedere a questo metodo? Si prega di aiutare se potete. Ho graffiato tutto ma è andato tutto invano.

Grazie Sanat

+0

se si aggiunge, prima della chiamata picasso, la riga 'Log.d (" myapp ", app.getListBookDetails(). Get (img_num) .getImage_150x225());' cosa dice? – Budius

+0

Mi mostra l'URL dell'immagine per il quale ho usato Picasso. –

+0

La tua app dispone dell'autorizzazione di rete? Put – Budius

risposta

5

Ecco il codice di esempio nel caso in cui si desidera impedire oggetto di destinazione di essere garbage collection:

final Target mTarget = new Target() { 
         @Override 
         public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom loadedFrom) { 
          Log.d("DEBUG", "onBitmapLoaded"); 
          BitmapDrawable mBitmapDrawable = new BitmapDrawable(getResources(), bitmap); 
          navigationMenuItem.setIcon(mBitmapDrawable); 
         } 

         @Override 
         public void onBitmapFailed(Drawable drawable) { 
          Log.d("DEBUG", "onBitmapFailed"); 
         } 

         @Override 
         public void onPrepareLoad(Drawable drawable) { 
          Log.d("DEBUG", "onPrepareLoad"); 
         } 
        }; 


        Picasso.with(this).load(tempUrl).into(mTarget); 
+4

Come è possibile diverso dal codice originale di OP? –

+0

@AdamJohns Ho finalizzato l'oggetto Target per evitare che si raccolga dati inutili – Killer

+0

Questo non funzionerà: 'final' significa che la variabile locale non è modificabile a livello di lingua, ma ciò non impedisce l'oggetto di riferimento raccolti dal GC concorrente quando termina l'ambito di visibilità della variabile. –

0

Al fine di ottenere l'uso di bitmap successivo con RxJava 2:

fun getBitmapSingle(picasso: Picasso, url: String): Single<Bitmap> = Single.create { 
    try { 
     if (!it.isDisposed) { 
      val bitmap: Bitmap = picasso.load(url).get() 
      it.onSuccess(bitmap) 
     } 
    } catch (e: Throwable) { 
     it.onError(e) 
    } 
} 

Recupera Bitmap:

getBitmapSingle(Picasso.with(context), "https:/...") 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe({ bitmap -> 
       // val drawable = BitmapDrawable(context, bitmap) 
       }, Throwable::printStackTrace)