我怎样才能发现在后台加载 JavaFX 图像失败?
How can I find out that JavaFX Image loading in background has failed?
问题简述:
我怎么知道 image
的后台加载在 imageView.setImage(image)
之前失败导致显示空白图片,尽管 image.isError==false
和 image.getException==null
?
背景:
在我基于 JavaFX 的简单照片查看器应用程序中,我使用 TableView() 来显示包含 jpg 文件的目录。每当在 table 中选择一个条目时,图片就会使用 javafx Image class 加载并使用 ImageView 显示。
我在图像构造函数的参数中使用 true
在后台加载照片。
加载照片后,我将其保存在列表 ("Cache") 中以便更快 "showing again"
这里是代码片段:
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 中显示 "empty" :-(
问题:
我如何才能知道 image
的后台加载在 imageView.setImage(image)
之前失败了?
How can I find out, that background loading of image has failed just before imageView.setImage(image)
?
这是不可能的。在后台加载图像的全部意义在于它是异步完成的。无法保证方法 returns 时异常已经发生。您需要使用 error
属性 的侦听器来通知加载图像失败。
例子
Image image = new Image("https://whosebug.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();
});
问题简述:
我怎么知道 image
的后台加载在 imageView.setImage(image)
之前失败导致显示空白图片,尽管 image.isError==false
和 image.getException==null
?
背景:
在我基于 JavaFX 的简单照片查看器应用程序中,我使用 TableView() 来显示包含 jpg 文件的目录。每当在 table 中选择一个条目时,图片就会使用 javafx Image class 加载并使用 ImageView 显示。
我在图像构造函数的参数中使用 true
在后台加载照片。
加载照片后,我将其保存在列表 ("Cache") 中以便更快 "showing again"
这里是代码片段:
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 中显示 "empty" :-(
问题:
我如何才能知道 image
的后台加载在 imageView.setImage(image)
之前失败了?
How can I find out, that background loading of image has failed just before
imageView.setImage(image)
?
这是不可能的。在后台加载图像的全部意义在于它是异步完成的。无法保证方法 returns 时异常已经发生。您需要使用 error
属性 的侦听器来通知加载图像失败。
例子
Image image = new Image("https://whosebug.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();
});