Используйте Picasso, чтобы получить обратный вызов с растровым изображением
Я использую Пикассо скачать картинки для моего приложения.
Я в ситуации, когда мне нужно получить доступ к Bitmap
сначала перед загрузкой в ImageView
. Наличие Downloader.Response
класс, кажется, предполагает, что это возможно, но я не могу найти никаких примеров использования. Я не хочу писать кучу больше кода, чтобы асинхронно обрабатывать этот конкретный случай, если это возможно сделать с Пикассо.
может кто-нибудь показать мне, как это сделать?
5 ответов:
нашел ответ на 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(); }
сообщение рекомендует не использовать анонимный обратный вызов, а вместо этого использовать переменную экземпляра для target.
принято от здесь:
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(e: java.lang.Exception?, 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?) { } }
что может быть проще, чем следующий:
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)
я использовал Пикассо В. 2.5.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. При оформлении подписки, сохраните ссылку на подписку на вашу активность, в противном случае цель будет ГК, что прежде чем вы получите ответ...
С помощью целевого сборщика мусора запустите ваш plans.so я делаю трюк с этим примером кода:
ImageView bitmapImageView = new ImageView(context); picasso.with(context).load(url).into(bitmapImageView); Bitmap bitmap = ((BitmapDrawable)bitmapImageView.getDrawable()).getBitmap();
теперь вы можете наслаждаться растровым изображением; :))