2016-03-11 67 views
3

我正在做一個簡單的圖片瀏覽器java,使用javafx
打開約10張圖片後,它需要很多ram!如何關閉一個打開的圖像,java/javafx

很明顯,我需要正確關閉打開的圖片(即現在還沒有露出來了!)(在我的測試/使用的情況下,照片是巨大的!)

這只是一塊代碼.. 。
但它的一切都需要知道

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

,因爲它似乎真的很簡單! ...一個簡單的方法將不勝感激!
順便說一句...代碼工作,這只是關於我的評論

部分我用的垃圾收集器,但我還是希望有一個更好的辦法我所知system.gc降低了約50%,內存使用是不可靠的

這裏是一個日誌開放30個縮略圖和一個完整的質量PIC:
enter image description here

+0

嘗試檢出此問題http://stackoverflow.com/questions/26325996/safely-close-remove-file-for-imageview- in-javafx –

+0

請發佈負責加載圖片的代碼並描述用戶如何在不同的圖片之間交換。 – fabian

+0

@ Collins.A這篇文章是關於刪除...已閱讀它... tnx無論如何 – SASA1024

回答

0

您需要刪除該圖片的所有引用。在ImageView中有對Image的引用,所以您或者需要刪除對ImageView的任何引用,或者將ImageView中的圖像字段設置爲null。

我在您的代碼中看到三個集合,其中對Image或ImageViews的引用可以延續。

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位置。然後實時加載它。如果你想提前加載所有東西,那麼內存使用就是成本。

此外,在您的旅行期間看看WeakHashMap。這是一個地圖,將刪除舊的引用給你,這將釋放你的內存。因此,您只需將注意力集中在您的集合中添加Images/ImageViews,並讓Java的WeakHashMap刪除它們即可。

+1

似乎所有對全尺寸圖像的引用已被刪除,預覽''ImageView'被替換。另外'adrs'和'list'中的'Image's似乎已經被下采樣了。 – fabian

+0

我加載的唯一的東西是縮略圖和地址(網址?) 與選擇的每張圖片,一張圖片完全加載到預覽中,選擇下一張圖片,之前的圖片(預覽中,沒有引用了)保持在RAM – SASA1024

+0

@fabian如何用新的ImageView替換預覽與交換圖像字段? –

0

到目前爲止,似乎還沒有一個簡單的方法...
finilize()可能是有用的......(但不知道如何使用它呢!)

delete-unused-variables-memory-in-java我設法解答將RAM的使用量減少到100MB以下。但由於它使用gc,因此它不可靠(System.gc命令可能無法運行gc)