2009-11-24 28 views
9

Tôi thực sự có hai câu hỏi mà họ đang loại liên quan vì vậy đây họ đi như một ...câu hỏi TreeViewer Lazy và thu nhập hoãn lại

Làm thế nào để đảm bảo thu gom rác thải của các nút cây không được hiển thị hiện thời sử dụng TreeViewer (SWT.VIRTUAL) và ILazeTreeContentProvider? Nếu nút có 5000 trẻ em, một khi chúng được hiển thị bởi người xem, chúng sẽ không bao giờ buông bỏ, do đó Lỗi bộ nhớ nếu cây của bạn có số lượng nút và lá lớn và kích thước heap không đủ lớn. Có một số loại thực hành tốt nhất để tránh rò rỉ bộ nhớ, gây ra bởi chế độ xem không bao giờ bị đóng giữ một thanh thu nhỏ với số lượng lớn dữ liệu (hàng trăm nghìn đối tượng hoặc thậm chí hàng triệu)? Có lẽ có một số giao diện gọi lại cho phép linh hoạt hơn với các yếu tố người xem/nhà cung cấp nội dung?

Có thể kết hợp deffered (DeferredTreeContentManager) VÀ lười biếng (ILazyTreeContentProvider) tải cho một đơn TreeViewer (SWT.VIRTUAL)? Nhiều như tôi hiểu bằng cách xem xét các ví dụ và API, bạn chỉ có thể sử dụng một trong hai thời điểm cụ thể nhưng không thể kết hợp cả hai, ví dụ: , chỉ tìm nạp các con hiển thị cho một nút đã cho VÀ tìm nạp chúng trong một chuỗi riêng biệt bằng cách sử dụng API công việc. Điều làm phiền tôi là cách tiếp cận hoãn lại tải TẤT CẢ trẻ em. Mặc dù trong một chủ đề khác, bạn vẫn tải tất cả các phần tử mặc dù chỉ có một tập con tối thiểu được hiển thị cùng một lúc.

tôi có thể cung cấp các ví dụ mã cho những câu hỏi của tôi nếu có yêu cầu ...

Tôi hiện đang phải vật lộn với những bản thân mình nên nếu tôi quản lý để đưa ra một cái gì đó trong khi chờ đợi tôi sẽ sẵn sàng chia sẻ nó ở đây.

Cảm ơn!

Kính trọng, Svilen

+0

để tải chậm, người xem báo cáo với nhà cung cấp, rằng một phần tử cụ thể sẽ được hiển thị (do cuộn hoặc mở rộng). các triển khai trì hoãn hiện tại có thể dễ dàng đạt được bằng cách sử dụng một công việc trong các phương thức của nhà cung cấp nội dung. vấn đề với cả hai phương pháp, tại sao chúng có thể độc quyền: tải chậm giả định bạn biết phần tử đếm trước và thay thế nội dung của trình xem trong thời gian nội dung được hiển thị. bạn không muốn tải nội dung (ví dụ: từ tài nguyên đã nhớ), mỗi khi người dùng cuộn hoặc mở rộng nội dung nào đó. – benez

Trả lời

11

tôi thấy khuôn khổ Eclipse đôi khi tâm thần phân liệt. Tôi nghi ngờ rằng DeferredTreeContentManager vì nó liên quan đến ILazyTreeContentProvider là một trong những trường hợp này.

Trong một ví dụ khác, tại EclipseCon năm ngoái, họ khuyên bạn nên sử dụng các nhà máy bộ chuyển đổi (IAdapterFactory) để thích ứng với các mô hình của bạn với bối cảnh ràng buộc cần thiết vào thời điểm đó. Ví dụ: nếu bạn muốn mô hình của mình hiển thị trên cây, hãy làm theo cách này.

treeViewer = new TreeViewer(parent, SWT.BORDER); 
IAdapterFactory adapterFactory = new AdapterFactory(); 
Platform.getAdapterManager().registerAdapters(adapterFactory, SomePojo.class); 
treeViewer.setLabelProvider(new WorkbenchLabelProvider()); 
treeViewer.setContentProvider(new BaseWorkbenchContentProvider()); 

Đăng ký bộ điều hợp của bạn và BaseWorkbenchContentProvider sẽ tìm thấy sự thích ứng trong nhà máy. Tuyệt vời. Nghe có vẻ giống như một kế hoạch.

"Oh by-the-way, khi bạn có bộ dữ liệu lớn, xin vui lòng làm theo cách này", họ nói:

TableViewertableViewer = new TableViewer(parent, SWT.VIRTUAL); 
// skipping the noise 
tableViewer.setItemCount(100000); 
tableViewer.setContentProvider(new LazyContentProvider()); 
tableViewer.setLabelProvider(new TableLabelProvider()); 
tableViewer.setUseHashlookup(true); 
tableViewer.setInput(null); 

Nó chỉ ra rằng ví dụ đầu tiên và thứ hai là không chỉ không tương thích, nhưng họ đang loại trừ lẫn nhau. Hai phương pháp này có thể được thực hiện bởi các nhóm khác nhau không có kế hoạch chung hoặc có thể API đang ở giữa quá trình chuyển đổi sang một khung công tác chung. Tuy nhiên bạn đang ở trên của riêng bạn.

+4

Đây là một câu trả lời tuyệt vời! Bạn đặt nó ra độc đáo - jface API tự mâu thuẫn khi nói đến việc sử dụng tải chậm và trì hoãn cùng một lúc. Đó là một sự xấu hổ. Có lẽ bạn có thể đưa ra giải pháp dựa trên SWT, xử lý đa luồng một mình, nhưng tôi thực sự hy vọng rằng hai đội đó gặp tai nạn trong giờ uống cà phê và nghĩ "bạn biết đấy, kết hợp cả hai cách tiếp cận có ý nghĩa và sẽ thêm giá trị bổ sung cho API của chúng tôi. " Đoán không. :( – Svilen