Используйте Picasso для получения обратного вызова с помощью Bitmap

Я использую Picasso для загрузки изображений для своего приложения.

Я в ситуации, когда мне нужно получить доступ к Bitmap сначала, прежде чем он загрузится в ImageView. Наличие класса Downloader.Response, по-видимому, предполагает, что это возможно, но я не могу найти примеры использования. Я не хочу писать кучу больше кода, чтобы асинхронно обрабатывать этот конкретный случай, если это возможно с Picasso.

Может ли кто-нибудь показать мне, как это сделать?

Ответ 1

Нашел ответ на github, если кто-то задается вопросом:

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

      @Override
      public void onBitmapFailed(Drawable errorDrawable) {
      }

      @Override
      public void onPrepareLoad(Drawable placeHolderDrawable) {
      }
}

private void someMethod() {
   Picasso.with(this).load("url").into(target);
}

@Override 
public void onDestroy() {  // could be in onPause or onStop
   Picasso.with(this).cancelRequest(target);
   super.onDestroy();
}

Сообщение рекомендует не использовать анонимный обратный вызов и вместо этого использовать переменную экземпляра для цели.

Ответ 2

взято из здесь:

Picasso.with(this)
    .load(url)
    .into(new Target() {
        @Override
        public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from){
            /* Save the bitmap or do something with it here */

            //Set it in the ImageView
            theView.setImageBitmap(bitmap); 
        }
});

Обновлено (04 мая 2016 года):

            Picasso.with(this)
                .load(youUrl)
                .into(new Target() {
                    @Override
                    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {

                    }

                    @Override
                    public void onBitmapFailed(Drawable errorDrawable) {

                    }

                    @Override
                    public void onPrepareLoad(Drawable placeHolderDrawable) {

                    }
                });

Обновлено (22 ноября 2016 года)

или используя сильную ссылку для Target, чтобы она не собиралась с мусором

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

            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {

            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {

            }
        };


void foo() {
        Picasso.with(getContext()).load(getUrl()).into(target);
}

котлинский

object: com.squareup.picasso.Target {
                  override fun onBitmapFailed(errorDrawable: Drawable?) {
                    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
                  }

                  override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
                    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
                  }

                  override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {

                  }
                }

Ответ 3

Я подумал, может быть, некоторые из вас хотели бы получить версию RxJava из вышеприведенного ответа... Вот она:

    public static Observable<Bitmap> loadBitmap(Picasso picasso, String imageUrl) {
    return Observable.create(new Observable.OnSubscribe<Bitmap>() {
        @Override
        public void call(Subscriber<? super Bitmap> subscriber) {
            Target target = new Target() {
                @Override
                public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                    subscriber.onNext(bitmap);
                    subscriber.onCompleted();
                }

                @Override
                public void onBitmapFailed(Drawable errorDrawable) {
                    subscriber.onError(new Exception("failed to load " + imageUrl));
                }

                @Override
                public void onPrepareLoad(Drawable placeHolderDrawable) {
                }
            };
            subscriber.add(new Subscription() {
                private boolean unSubscribed;

                @Override
                public void unsubscribe() {
                    picasso.cancelRequest(target);
                    unSubscribed = true;
                }

                @Override
                public boolean isUnsubscribed() {
                    return unSubscribed;
                }
            });
            picasso.load(imageUrl).into(target);
        }
    });
}

P.S. При подписке сохраните ссылку на подписку на свою активность, иначе цель будет GC'd, прежде чем вы получите ответ...

Ответ 4

с использованием целевого сборщика мусора исчерпайте ваши планы. Так что я делаю трюк с этим примером кода:

ImageView bitmapImageView = new ImageView(context);
picasso.with(context).load(url).into(bitmapImageView);
Bitmap bitmap = ((BitmapDrawable)bitmapImageView.getDrawable()).getBitmap();

теперь вы можете наслаждаться своим растровым изображением;:))