[android] Picasso를 사용하여 비트 맵으로 콜백 받기
Picasso 를 사용하여 내 앱의 이미지를 다운로드하고 있습니다.
.NET Framework에 Bitmap
로드되기 전에 첫 번째 파일 에 액세스해야하는 상황에 있습니다 ImageView
. Downloader.Response
수업 의 존재 는 이것이 가능하다는 것을 암시하는 것처럼 보이지만 사용 예를 찾을 수 없습니다. 피카소로 할 수 있다면이 특정한 경우를 비동기 적으로 처리하기 위해 더 많은 코드를 작성하고 싶지 않습니다.
누구든지 방법을 보여줄 수 있습니까?
답변
누군가 궁금해하는 경우 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();
}
이 게시물은 익명 콜백을 사용하지 않고 대신 대상에 인스턴스 변수를 사용하도록 권장합니다.
답변
여기 에서 가져온 :
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);
}
});
업데이트 됨 (2016 년 5 월 4 일) :
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) {
}
});
업데이트 됨 (2016 년 11 월 22 일)
또는 강력한 참조를 사용하여 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);
}
Kotlin
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)
Picasso v.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);
}
});
}
추신 : 구독 할 때 활동에 대한 구독 참조를 저장하십시오. 그렇지 않으면 응답을 받기 전에 대상이 GC됩니다.