Как я могу узнать, что загрузка изображения JavaFX в фоновом режиме не удалась? - PullRequest
0 голосов
/ 07 июля 2019

Вопрос вкратце:

Как узнать, что фоновая загрузка image не удалась незадолго до того, как imageView.setImage(image) приведет к отображению пустой картинки, хотя image.isError==false и image.getException==null?

Справочная информация:

В моем простом приложении для просмотра фотографий на основе JavaFX я использую TableView () для отображения каталога с файлами jpg. Всякий раз, когда кто-либо выбирает запись в таблице, изображение загружается с использованием класса изображений javafx и отображается с использованием ImageView.

Я загружаю фотографии в фоновом режиме, используя true в параметре Image-constructor. После загрузки фотографии я сохраняю ее в списке («Кэш») для более быстрого «показа снова»

Вот фрагмент кода:

public Object getMediaContent() {
Image image = (Image) content;

if (!isMediaContentValid()) {  //if not already loaded or image in cache is invalid
  try {
    System.out.println("getMediaContent loading " + fileOnDisk);
    content = new Image(fileOnDisk.toUri().toString(), true);  //true=load in Background
  } catch (Exception e) {
    //will not occur with backgroundLoading: image.getException will get the exception
    System.out.println("Exception while loading:");
    e.printStackTrace();
  }
} else {
  System.out.println(fileOnDisk.toString() + "in Cache :-)...Error="+ image.isError() + " Exception=" + image.getException());
}
return content;

}

В isMediaContentValid() Я тестирую

  • если изображение уже есть в списке кеша
  • , а если image.isError() равно false
  • , а если image.getException() - null

Проблема:

Когда пользователь выбирает фотографии очень быстро (например, с помощью клавиши курсора вниз), изображения по-прежнему загружаются в фоновом режиме (для кэша), пока загрузка следующей фотографии уже началась. У моего простого алгоритма chache есть проблемы, чтобы узнать, когда у меня заканчивается память, потому что может быть достаточно памяти при запуске загрузки, но не для выполнения всех фоновых задач.

Но я ожидал, что это не проблема, потому что image.isError() сообщит true или image.getException() будет != null в этом случае. Так что я мог освободить память перед повторной попыткой.

Но isError() сообщает false, getException() сообщает null, и изображение отображается "пустым" в imageView: - (

Вопрос: Как я могу узнать, что фоновая загрузка image не удалась незадолго до imageView.setImage(image)?

1 Ответ

2 голосов
/ 07 июля 2019

Как я могу узнать, что фоновая загрузка изображения не удалась как раз перед imageView.setImage(image)?

Это невозможно. Весь смысл загрузки изображения в фоновом режиме заключается в том, что оно выполняется асинхронно. Нет гарантии, что исключение уже произошло в момент возврата метода. Вам необходимо использовать прослушиватель свойства error, чтобы получать уведомления о сбое при загрузке изображения.

Пример

Image image = new Image("https://stackoverflow.com/abc.jpg", true); // this image does not (currently) exist
image.errorProperty().addListener(o -> {
    System.err.println("Error Loading Image " + image.getUrl());
    image.getException().printStackTrace();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...