2009-11-24 5 views
9

У меня есть на самом деле два вопроса, но они отчасти связаны с тем здесь они идут как один ...Ленивые и отложенным TreeViewer вопросы

Как обеспечить вывоз мусора из узлов дерева, которые в настоящее время не отображается с помощью TreeViewer (SWT.VIRTUAL) и ILazeTreeContentProvider? Если у узла есть 5000 детей, как только они будут отображаться зрителем, они никогда не будут отпущены, , следовательно, Ошибка в памяти, если ваше дерево имеет большое количество узлов и листьев и не достаточно большой размер кучи. Есть ли какая-то лучшая практика, как избежать утечек памяти, вызванных никогда закрытым представлением, содержащим treeviewer с большим количеством данных (сотни тысяч объектов или даже миллионов)? Возможно, возможно, есть какой-то интерфейс обратного вызова, который обеспечивает большую гибкость в отношении элементов-провайдеров/контент-провайдеров?

Можно ли совместить deffered (DeferredTreeContentManager) и ленивая (ILazyTreeContentProvider) загрузки для одного TreeViewer (SWT.VIRTUAL)? Насколько я понимаю, глядя на примеры и API, можно использовать только один в заданное время, но не оба вместе, например. , Извлечь ТОЛЬКО видимых дочерних элементов для заданного узла И получить их в отдельном потоке с помощью Job API. Меня беспокоит то, что отложенный подход загружает ВСЕ детей. Хотя в другом потоке вы все равно загружаете все элементы , хотя одновременно отображается только минимальное подмножество.

Я могу привести примеры кода на мои вопросы, если требуется ...

Я в настоящее время борюсь с теми себя так, если мне удастся придумать что-то в то же время я с удовольствием поделюсь здесь.

Спасибо!

С уважением, Svilen

+0

для ленивой загрузки, зрители сообщают провайдеру, что будет отображаться конкретный элемент (из-за прокрутки или расширения). текущие отложенные реализации могут быть легко достигнуты с использованием задания в методах поставщика контента. проблема с обоими методами, почему они могут быть эксклюзивными: ленивая загрузка предполагает, что вы знаете количество элементов заранее и заменяет содержимое зрителя за время отображения содержимого. вы не хотите загружать контент (например, из ресурса remore), каждый раз, когда пользователь прокручивает или расширяет что-то. – benez

ответ

11

Я считаю, рамки Eclipse, иногда шизофреник. Я подозреваю, что DeferredTreeContentManager, относящийся к ILazyTreeContentProvider, является одним из этих случаев.

В другом примере на EclipseCon в прошлом году они рекомендовали использовать фабрики адаптеров (IAdapterFactory) для адаптации ваших моделей к контексту привязки, необходимому в то время. Например, если вы хотите, чтобы ваша модель отображалась в дереве, сделайте это так.

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

Зарегистрируйте свой адаптер и BaseWorkbenchContentProvider найти адаптацию на заводе. Замечательно. Звучит как план.

«О бай-зе-пути, когда у вас есть большие массивы данных, пожалуйста, сделать это таким образом», они говорят:

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); 

Оказывается, что первый и второй примеры не только несовместимы, но они 'взаимно исключая. Эти два подхода, которые, вероятно, были реализованы разными командами, не имеющими общего плана или, возможно, API, находятся в середине перехода к общей структуре. Тем не менее ты сам по себе.

+4

Это отличный ответ! Вы прекрасно это понимаете - API jface сам по себе противоречит, когда речь заходит об использовании ленивой и отложенной загрузки в одно и то же время. Какой позор. Возможно, можно придумать решение на основе SWT, самостоятельно обработать многопоточность, но я действительно надеялся, что эти две команды случайно встретились во время перерыва на кофе и подумали: «Вы знаете, что сочетание обоих подходов имеет смысл и добавит дополнительное значение для нашего API ». Думаю нет. :( – Svilen