Используйте 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();
теперь вы можете наслаждаться своим растровым изображением;:))