使用Picasso通过Bitmap获取回调

时间:2013-11-24 21:51:05

标签: android bitmap picasso

我正在使用Picasso为我的应用下载图片。

我处于Bitmap加载到ImageView之前需要首先访问Downloader.Response的情况。 {{1}}类的存在似乎表明这是可能的,但我找不到任何使用示例。我不想写一堆更多的代码来异步处理这个特殊情况,如果它可以与Picasso一起使用的话。

任何人都可以告诉我该怎么做吗?

4 个答案:

答案 0 :(得分:163)

如果有人想知道,请在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();
}

帖子建议不要使用匿名回调,而是使用实例变量作为目标。

答案 1 :(得分:5)

比下一个更容易:

val url: String = "https://...."
val bitmap: Bitmap = Picasso.with(context).load(url).get()

应该从主线程调用!

或使用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)

我使用了Picasso v.2.5.2

答案 2 :(得分:2)

我想也许你们中的一些人会想要上述答案的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 ...

答案 3 :(得分:-5)

使用目标垃圾收集器耗尽你的计划。所以我用这个示例代码做了一个技巧:

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

现在你可以享受你的位图; :))