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

时间:2016-03-11 10:48:57

标签: 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%的ram使用率但我仍然想要更好的方法,因为我知道system.gc不可靠

这是一个用于打开30个缩略图和一个完整质量图片的日志:
enter image description here

2 个答案:

答案 0 :(得分:0)

您需要删除对图像的所有引用。在ImageView中有对Image的引用,因此您还需要删除对ImageView的任何引用,或者将ImageView中的image字段设置为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;

您必须找到一种方法从这些集合中删除这些对象。只要他们在那里,他们就会占用公羊。

我会考虑做的不是存储图像和放大器。 ImageView对象本身可能会将URL存储到它们中。 URL可以指向文件或http位置。然后实时加载它。如果你想提前装载所有东西,那么使用ram就是成本。

此外,在您旅行期间,请查看WeakHashMap。这是一个地图,将删除旧的引用,这将释放你的内存。因此,您只需要专注于将Images / ImageViews添加到您的集合中,并让Java的WeakHashMap删除它们。

答案 1 :(得分:0)

到目前为止,似乎还没有一个简单的方法...... finilize()可能有用......(但不知道如何使用它!)

来自Go-like Channels的答案我设法将ram使用量减少到不足100mb。但由于它使用gc,它不可靠(System.gc命令可能无法运行gc)