Frage

Ich habe eigentlich zwei Fragen, aber sie sind so eine Art so hier gehen sie als eine im Zusammenhang ...

Wie die Garbage Collection von Baumknoten, um sicherzustellen, dass derzeit nicht TreeViewer (SWT.VIRTUAL) mit und ILazeTreeContentProvider dargestellt? Wenn ein Knoten 5000 Kinder, sobald sie durch den Betrachter angezeigt werden, werden sie nie mehr loslassen, also außerhalb des Speicherfehlers, wenn Ihr Baum hat eine große Anzahl von Knoten und Blättern und nicht groß genug Heap-Größe. Gibt es irgendeine Art von Best Practice, wie Speicherlecks zu vermeiden, indem er nie geschlossen Ansicht verursachte eine TreeViewer mit großen Datenmengen (Hunderttausenden Objekten oder sogar Millionen) halten? Vielleicht vielleicht gibt es einige Callback-Schnittstelle, die mit Viewer / Content-Provider-Elemente eine größere Flexibilität erlauben?

Ist es möglich, DEFFERED (DeferredTreeContentManager) zu kombinieren und zu faul (ILazyTreeContentProvider) Laden für einen einzelnen TreeViewer (SWT.VIRTUAL)? So viel wie ich durch einen Blick auf Beispielen und APIs zu verstehen, ist es nur möglich, entweder eine zu einem bestimmten Zeitpunkt zu verwenden, aber nicht beide in Verbindung, z.B. . holt nur die sichtbaren Kinder für einen bestimmten Knoten und holen sie in einem separaten Thread Job-API. Was mich stört ist, dass latente Ansatz lädt alle Kinder. Obwohl in einem anderen Thread, laden Sie es noch alle Elemente obwohl nur eine minimale Teilmenge auf einmal angezeigt werden.

kann ich Code-Beispiele auf meine Fragen geben, wenn erforderlich ...

Ich bin derzeit selbst mit denen zu kämpfen, so, wenn ich in der Zwischenzeit mit etwas einfallen lassen, verwalten will ich es gerne hier teilen.

Danke!

Viele Grüße, Svilen

War es hilfreich?

Lösung

Ich finde den Eclipse-Framework manchmal schizophren. Ich vermute, dass die DeferredTreeContentManager wie es um die ILazyTreeContentProvider bezieht sich einer dieser Fälle ist.

In einem anderen Beispiel auf der EclipseCon im vergangenen Jahr empfohlen sie, dass Sie Adapter Fabriken verwenden (IAdapterFactory) Ihre Modelle auf den Bindungskontext zu dem Zeitpunkt benötigt anzupassen. Zum Beispiel, wenn Sie Ihr Modell in einem Baum zeigen wollen, tut es auf diese Weise.

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

Registrieren Sie Ihren Adapter und der BaseWorkbenchContentProvider wird die Anpassung in der Fabrik finden. Wunderbar. Klingt wie ein Plan.

"Oh by-the-Art und Weise, wenn Sie große Datenmengen haben, können Sie es tun, auf diese Weise", sagen sie:

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

Es stellt sich heraus, dass erste und zweite Beispiele sind nicht nur unvereinbar, aber sie sind gegenseitig aus. Diese beiden Ansätze, wo wahrscheinlich von unterschiedlichen Teams durchgeführt, die einen gemeinsamen Plan oder vielleicht die API hat in der Mitte eines Übergangs zu einem gemeinsamen Rahmen. Trotzdem sind Sie auf eigene Faust.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top