2014-09-22 2 views
5

У меня такая же проблема, что я хочу использовать чертежи, которые генерируются Picasso для цели кэширования изображений, но я не могу получить то же самое. Вот код, который я использую, чтобы получить доступ к Bitmap вводимого коэффициента:Picasso onBitmapLoaded никогда не назывался

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

Но здесь onBitmapLoaded метод никогда не вызывается. Как я могу получить доступ к этому методу? Пожалуйста, помоги, если можешь. Я поцарапал все, но все напрасно.

Благодаря Санат

+0

Если вы добавите перед вызовом picasso строку 'Log.d (« myapp », app.getListBookDetails(). Get (img_num) .getImage_150x225());' что это говорит? – Budius

+0

Он показывает мне URL-адрес изображения, для которого я использовал пикассо. –

+0

Имеет ли ваше приложение разрешение на работу в сети? Положите – Budius

ответ

5

Вот пример кода в случае, если вы хотите, чтобы предотвратить целевой объект из сборщиком мусора:

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

Как это отличается от исходного кода OP? –

+0

@AdamJohns, я сделал целевой объект final, чтобы предотвратить его сбор мусора. – Killer

+0

Это не сработает: 'final' означает, что локальная переменная нечувствительна на уровне языка, но это не мешает объекту, на который ссылается объект собранных параллельным GC, когда область видимости переменной заканчивается. –

0

Для того, чтобы получить Bitmap использовать следующий с 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) 
    } 
} 

Извлечь растровое изображение:

getBitmapSingle(Picasso.with(context), "https:/...") 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe({ bitmap -> 
       // val drawable = BitmapDrawable(context, bitmap) 
       }, Throwable::printStackTrace) 
Смежные вопросы