2013-02-26 32 views
5

Tôi gặp sự cố khi tải hình ảnh vào ứng dụng của mình. Tôi đang cố gắng tạo một trình duyệt hình ảnh đơn giản. Ở bên trái tôi có một danh sách các thư mục. Sau khi nhấp vào tên của thư mục trên danh sách hình ảnh sẽ xuất hiện ở bên phải (cửa sổ dòng). Mỗi hình ảnh nằm trong một HBox với một đường viền. Nhưng tôi nhận được lỗi như nhanh chóng này:JavaFX - Đang tải hình ảnh và sự cố bộ nhớ

java.lang.outofmemoryerror java heap space 

Tôi nhìn vào công việc quản lý - nếu tôi tải chỉ có 6 hình ảnh ứng dụng có 500MB bộ nhớ! Và một điều nữa - nếu tôi thay đổi thư mục trong danh sách, bộ nhớ vẫn được giữ lại. Trong khi lựa chọn một thư mục khác tôi là tạo ra flowPane mới

flowPane = new FlowPane(); 

Vì vậy, cái cũ với tất cả các ImageViews nên được xóa bởi các bộ thu rác, phải không?

Tôi làm cách nào để quản lý hình ảnh trong ứng dụng của mình một cách hiệu quả?

for(int i = 0 ; i < zdjecia.length; i++){ 
     ImageView iv2 = new ImageView(); 
     Image image = new Image("file:"+zdjecia[i].getAbsolutePath()); 
     iv2.setImage(image); 
     if(image.getHeight() > image.getWidth()){ 
       iv2.fitHeightProperty().bind(szerokoscZdjecia.multiply(0.8).subtract(6)); 
     }else 
       iv2.fitWidthProperty().bind(szerokoscZdjecia.subtract(6)); 

     iv2.setPreserveRatio(true); 
     iv2.setSmooth(true); 
     iv2.setCache(false); 

     String styl = "-fx-border-color: #b2b3b3;" 
       + "-fx-border-width: 2;"; 

     HBox boxNaFotke = new HBox(); 
     boxNaFotke.prefWidthProperty().bind(szerokoscZdjecia); 
     boxNaFotke.prefHeightProperty().bind(szerokoscZdjecia.multiply(0.8)); 
     boxNaFotke.setAlignment(Pos.CENTER); 
     boxNaFotke.setStyle(styl); 
     boxNaFotke.getChildren().add(iv2); 
     fotki.add(boxNaFotke); 
     flowPane.getChildren().add(boxNaFotke); 
    } 
+0

Tôi có một vấn đề tương tự :( – Xdg

Trả lời

0

Tôi có vấn đề tương tự với bộ nhớ trong JavaFX nhưng được kết nối với phương pháp setStyle. Tôi đã phân tích việc sử dụng đống và tôi đã tìm thấy đối tượng StyleHelper giữ tất cả các tham chiếu đến tất cả các kiểu được thiết lập bởi phương thức setStyle (rất nhiều trường hợp HashMap với GC root trong com.sun.javafx.css.StyleManager $ Holder). Nó có thể là một vấn đề khi phong cách thường được thay đổi.

Thử nhận xét boxNaFotke.setStyle (styl); và kiểm tra xem nó có giúp ích gì không.

3

Nếu bạn mở rộng Image bằng cách sử dụng constructor, dung lượng bộ nhớ cần thiết sẽ giảm đáng kể.

Một số ví dụ từ các tài liệu:

// tải một hình ảnh và thay đổi kích thước 100x150 mà không giữ gìn tỉ lệ ban đầu của nó
// Hình ảnh nằm ở my.res gói classpath
Image image2 = new Image("my/res/flower.png", 100, 150, false, false);

// tải một hình ảnh và thay đổi kích thước chiều rộng là 100 trong khi vẫn giữ
// tỉ lệ ban đầu của nó, sử dụng lọc nhanh metho d
// Hình ảnh tải về từ địa chỉ URL được cung cấp thông qua giao thức http
Image image3 = new Image("http://sample.com/res/flower.png", 100, 0, false, false);