2016-03-11 2 views
3

Я делаю простой просмотрщик изображений с java, используя javafx
после открытия около 10 фото, это занимает много оперативной памяти!как закрыть открытое изображение, 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

, как кажется быть очень простым! ... простой способ был бы оценен!
кстати ... код работает, это только о той части, которую я комментировал

я уменьшил около 50% использования оперативной памяти с помощью сборщика мусора, но я все еще хочу лучший способ, как я знаю, system.gc не является надежным

здесь является журналом для открытия 30 миниатюр и один полного качества ПОС:
enter image description here

+0

Попробуйте проверить это http://stackoverflow.com/questions/26325996/safely-close-remove-file-for-imageview- in-javafx –

+0

Пожалуйста, разместите код, отвечающий за загрузку изображений, и расскажите, как пользователь меняет места между разными фотографиями. – fabian

+0

@ Collins.A это сообщение об удалении ... уже прочитал его ... tnx anyway – SASA1024

ответ

0

Вы должны удалить все ссылки на изображения. Существует ссылка на изображение в ImageView, так что вам нужно будет либо удалить любые ссылки на 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. Затем загрузите его в режиме реального времени. Если вы хотите загрузить все заблаговременно, то тогда использование ram будет стоить.

Кроме того, во время путешествий изучите WeakHashMap. Это Карта, которая удалит старые ссылки для вас, которые освободят ваш баран. Таким образом, вам нужно сосредоточиться только на добавлении изображений/изображений в вашу коллекцию и позволить Java WeakHashMap удалить их.

+1

Похоже, что все ссылки на полноразмерное изображение уже удалены, когда изображение внутри 'preview'' ImageView' заменяется. Кроме того, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' уже кажется, – fabian

+0

Единственными вещами, которые я загружаю, являются миниатюры и адреса (urls?) с каждым выбранным рисунком, изображение полностью загружается в предварительный просмотр и с выбранным следующим снимком предыдущее изображение (в предварительном просмотре, которое больше не содержит ссылок) остается в ram – SASA1024

+0

@fabian, как насчет замены предварительного просмотра новым ImageView и заменой поля изображения? –

0

до сих пор, кажется, не существует простой способ ...
finilize() может быть полезно ... (но не знаю, как использовать его еще!)

с ответами от delete-unused-variables-memory-in-java я управляемом для уменьшения использования плунжера до менее 100 мб. но поскольку он использует gc, он не является надежным (команда System.gc может не запускать gc)

Смежные вопросы