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));
Другие вопросы по тегам