语言特点
爪哇
应用
我正在尝试创建一个基本图像搜索器,我在其中输入UPC并在ImageView上显示产品图像。
问题
如何在不创建新实例的情况下使用新图像动态更新ImageView,就像我在当前实现中所做的那样。
当前实施:
在我当前的实现中,我让事件处理程序创建一个新图像并将其设置为ImageView。
searchButton.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent e)
{
input = searchBar.getText();
image = new Image("url link" + input);
imageView.setImage(image);
searchBar.clear();
}
});
答案 0 :(得分:1)
简短的回答是,这是不可避免的。这种实现完全正常。当您创建新的Image
并将其设置为ImageView
时,旧Image
会丢失该引用,并且有资格进行垃圾回收。
答案很长,你可以在一定程度上控制这种行为。您可以在SoftReference
的帮助下保留这些图像的缓存。
Map<String, SoftReference<Image>> imageCache = new HashMap<>();
.....
searchButton.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent e)
{
input = searchBar.getText();
final String urlString = "url link" + input; // Or whatever the URL
final SoftReference<Image> softRef = imageCache.get(urlString);
Image image = null;
if (softRef == null || softRef.get() == null) {
image = new Image(urlString);
imageCache.put(urlString, new SoftReference<>(image));
}
else
image = softRef.get();
imageView.setImage(image);
searchBar.clear();
}
});
这将允许您的控制器存储图像缓存,直到Java堆空间不足。