Fresco - onIntermediateImageSet из ControllerListener не вызывается

Я пытаюсь постепенно загрузить JPG большого размера. Я видел эта документация с использованием Fresco, и это именно то, что я хочу: эффект размытия отложенной загрузки. Я взял их код из репозитория образец, который выглядит следующим образом:

ImageFormatProgressiveJpegFragment.java

  private void setImageUri(Uri uri) {
    mDebugOutput.setText("");
    ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
        .setProgressiveRenderingEnabled(mProgressiveRenderingEnabled)
        .build();
    DraweeController controller =
        Fresco.newDraweeControllerBuilder()
            .setImageRequest(request)
            .setRetainImageOnFailure(true)
            .setPerfDataListener(mImagePerfDataListener)
            .setControllerListener(
                new BaseControllerListener<ImageInfo>() {
                  @Override
                  public void onFinalImageSet(
                      String id,
                      @javax.annotation.Nullable ImageInfo imageInfo,
                      @javax.annotation.Nullable Animatable animatable) {
                    if (imageInfo != null) {
                      QualityInfo qualityInfo = imageInfo.getQualityInfo();
                      logScan(qualityInfo, true);
                    }
                  }

                  @Override
                  public void onIntermediateImageSet(
                      String id, @javax.annotation.Nullable ImageInfo imageInfo) {
                    if (imageInfo != null) {
                      QualityInfo qualityInfo = imageInfo.getQualityInfo();
                      logScan(qualityInfo, false);
                    }
                  }

                  @Override
                  public void onIntermediateImageFailed(String id, Throwable throwable) {
                    mDebugOutput.append(
                        String.format(
                            Locale.getDefault(),
                            "onIntermediateImageFailed, %s\n",
                            throwable.getMessage()));
                  }
                })
            .build();
    mSimpleDraweeView.setController(controller);
  }

  private void logScan(QualityInfo qualityInfo, boolean isFinalImage) {
    mDebugOutput.append(
        String.format(
            Locale.getDefault(),
            "%s: %s, goodEnough=%b, fullQuality=%b, quality=%d\n\n",
            mDateFormat.format(new Date(System.currentTimeMillis())),
            isFinalImage ? "final" : "intermediate",
            qualityInfo.isOfGoodEnoughQuality(),
            qualityInfo.isOfFullQuality(),
            qualityInfo.getQuality()));
  }

результат — это вывод информации об изображении при его загрузке.

Мой код выглядит так же, за исключением частичной замены логов:

MyFrescoActivity.java


private String IMAGE_URL = "https://eoimages.gsfc.nasa.gov/images/imagerecords/73000/73726/world.topo.bathy.200406.3x5400x2700.png";

ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(IMAGE_URL))
                .setProgressiveRenderingEnabled(true)
                .build();

        DraweeController controller =
                Fresco.newDraweeControllerBuilder()
                        .setImageRequest(request)
                        .setRetainImageOnFailure(true)
                        .setPerfDataListener(this)
                        .setControllerListener(
                                new BaseControllerListener<ImageInfo>() {
                                    @Override
                                    public void onFinalImageSet(
                                            String id,
                                            @Nullable ImageInfo imageInfo,
                                            @Nullable Animatable animatable) {
                                        if (imageInfo != null) {
                                            QualityInfo qualityInfo = imageInfo.getQualityInfo();
                                            logScan(qualityInfo, true);
                                        }
                                    }

                                    @Override
                                    public void onIntermediateImageSet(
                                            String id, @Nullable ImageInfo imageInfo) {
                                        if (imageInfo != null) {
                                            QualityInfo qualityInfo = imageInfo.getQualityInfo();
                                            logScan(qualityInfo, false);
                                        }
                                    }

                                    @Override
                                    public void onIntermediateImageFailed(String id, Throwable throwable) {
                                        Log.i("DraweeUpdate",
                                                String.format(
                                                        Locale.getDefault(),
                                                        "onIntermediateImageFailed, %s\n",
                                                        throwable.getMessage()));
                                    }
                                })
                        .build();
        simpleDraweeView.setController(controller);
    }

    private void logScan(QualityInfo qualityInfo, boolean isFinalImage) {
        Log.i("DraweeUpdate", String.format(
                Locale.getDefault(),
                "%s: %s, goodEnough=%b, fullQuality=%b, quality=%d\n\n",
                "",
                isFinalImage ? "final" : "intermediate",
                qualityInfo.isOfGoodEnoughQuality(),
                qualityInfo.isOfFullQuality(),
                qualityInfo.getQuality()));
    }

Тем не менее, я не получаю ответов на onIntermediateImageSet. Единственное, что вызывается у этого слушателя, — это onFinalImageSet, когда изображение полностью загружено. Кто-нибудь имеет представление о том, что происходит?

2
0
243
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Вы уверены, что конфигурация вашего конвейера изображений настроена для прогрессивного Jpeg, как показано в примере Showcase?
  2. Если ваше изображение поступает из кеша, оно может быть отображено сразу.
  3. Точно так же, если ваша сеть слишком быстрая, вы не увидите прогресса.

Вы можете попробовать протестировать с эмулятором и типом сети, установленным на GPRS.

Не уверен насчет 1. ; Что ты имеешь в виду? .setProgressiveRenderingEnabled(true)? ; 2. Не из кеша, я каждый раз переустанавливаю приложение для проверки, что приводит к 3. с моим Ethernet занимает около 40 секунд, чтобы загрузить большое тестовое изображение, такое как в IMAGE_URL

Victor R. Oliveira 24.07.2019 16:23

Изменен IMAGE_URL на правильно отформатированный URL-адрес прогрессивного JPEG, и это сработало - lwstatic-a.akamaihd.net/kb/wp-content/uploads/2017/12/…

Victor R. Oliveira 25.07.2019 19:27

Другие вопросы по теме