java - 如何关闭打开的图像,java/javafx

标签 java javafx

我正在用 java 制作一个简单的图片查看器,使用 javafx
打开大约 10 张图片后,需要大量内存!

显然我需要正确关闭打开的图片(现在没有显示!)(在我的测试/用例中,图片很大!!)

这只是一段代码...
但这是需要知道的一切

private HashMap<Image, String> adrs;     // a hashMap from thumbNail to address of the image
ObservableList<ImageView> list;          // list of thumbNails
@FXML public ListView<ImageView> pics;
@FXML public ImageView preview;

public void init(String[] picAdrs){

    loadThumbNails(picAdrs);                    // initializes thumbNails (list)
    pics.setItems(list);

    pics.getSelectionModel().selectedItemProperty().addListener((v, oldvalue, newvalue) -> {
        // --> this is where the previous value of "preview.getImage()" should be closed <--
        // (and i don't know how!)
        preview.setImage( new Image(adrs.get(newvalue.getImage()));
        // and more (not related codes...)
    }
}

private void loadThumbNails(String[] picAdrs){
    // initializing list & adrs
    for(String i : picAdrs){

        Image img = new Image(new File(i).toURI().toString(), 200, 0, true, false);
        ImageView iv = new ImageView();
        iv.setImage(img);  

        adrs.put(img, new File(i).toURI().toString());
        list.add(iv);
    }


}

缩略图在左侧,“预览”在右侧:
Just a preview of the Scene

因为它看起来真的很简单! ...将不胜感激一个简单的方法!
顺便说一句......代码有效,它只是关于我评论的部分

我使用垃圾收集器减少了大约 50% 的内存使用量,但我仍然想要更好的方法,因为我知道 system.gc 不可靠

这是打开 30 张缩略图和一张全画质图片的日志:
enter image description here

最佳答案

您需要删除对图像的所有引用。 ImageView 中存在对 Image 的引用,因此您还需要删除对 ImageView 的任何引用,或者将 ImageView 中的图像字段设置为 null。

我在您的代码中看到三个集合,其中对 Image 或 ImageView 的引用可能会持续存在。

private HashMap<Image, String> adrs;     // a hashMap from thumbNail to address of the image
ObservableList<ImageView> list;          // list of thumbNails
@FXML public ListView<ImageView> pics;

您将不得不找到一种方法从这些集合中删除这些对象。只要他们在那里,他们就会占用内存。

我会考虑做的不是存储 Image 和 ImageView 对象本身,而是存储它们的 URL。 URL 可以指向文件或 http 位置。然后实时加载。如果您想提前加载所有内容,那么 ram 使用就是成本。

此外,在您旅行期间,请查看 WeakHashMap。这是一个将为您删除旧引用的 map ,这将释放您的内存。这样一来,您只需专注于将图像/ ImageView 添加到您的集合中,然后让 Java 的 WeakHashMap 删除它们。

关于java - 如何关闭打开的图像,java/javafx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35938258/

相关文章:

java - 仅使用一组示例数据创建生产的测试数据库副本

java - 带有 exec 返回错误 7 的 ant 任务

单击按钮时 Javafx 单元未选择

java - 在 Java 中连接到 Oracle 数据库 g11 版本 2 时出错

java - 用多个特殊字符拆分 : √(A&B)

java - 正则表达式在 Java 中不起作用

JavaFX 时间线监听器

java - Maven 构建后某些场景未加载

java - 自定义 JavaFX 事件

java - 使用 Double 列表对相应的 String 列表进行排序