IntentService Завершено до того, как Пикассо загрузит растровое изображение
Я пытаюсь использовать IntentService для обработки и загрузки изображений, которые выполняются в другом процессе, чтобы иметь больше памяти. Я использую также Пикассо, чтобы загрузить изображение. Когда изображение маленькое, растровое изображение успешно загружается и загружается, однако, если изображение большое, служба IntentService завершается до того, как Picasso завершит его загрузку.
Пикассо должен бежать по UIThread
Вот код
private void downloadImage(File file) {
final Uri uri = Uri.fromFile(file);
Handler uiHandler = new Handler(Looper.getMainLooper());
uiHandler.post(new Runnable() {
@Override
public void run() {
Picasso.with(NewImageProcessingService.this).load(uri).transform(new ImageLoadingUtil.DecreaseQualityTransformation(imageQuality)).into(NewImageProcessingService.this);
}
});
}
@Override
protected void onHandleIntent(Intent intent) {
File file = (File) intent.getSerializableExtra(KEY_IMAGE_FILE);
imageQuality = ImagesUtils.IMAGE_QUALITY
.values()[intent.getIntExtra(IMAGE_QUALITY, ImagesUtils.IMAGE_QUALITY.DEFAULT.ordinal())];
downloadImage(file);
}
1 ответ
Этот вопрос довольно старый, но если кто-нибудь шаг за шагом. Target
получает мусор, прежде чем он сможет показать растровое изображение.
Используйте это так
public class BitmapLoader {
public static Target getViewTarget(final OnImageLoadingCompleted onCompleted) {
return new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
onCompleted.imageLoadingCompleted(bitmap);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
}
}
Вы должны иметь сильную ссылку на Target
так что есть поле в вашем IntentService
держа его, например,
private Target viewTarget;
viewTarget = BitmapLoader.getViewTarget(bitmap -> {
// do stuff with the bitmap
});
new Handler(Looper.getMainLooper()).post(() -> Picasso.with(getApplicationContext()).load(object.getImageUrl()).into(viewTarget));