我正在使用Picasso为我的应用下载图片。
我处于Bitmap
加载到ImageView
之前需要首先访问Downloader.Response
的情况。 {{1}}类的存在似乎表明这是可能的,但我找不到任何使用示例。我不想写一堆更多的代码来异步处理这个特殊情况,如果它可以与Picasso一起使用的话。
任何人都可以告诉我该怎么做吗?
答案 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();
现在你可以享受你的位图; :))