Question

J'ai en fait deux questions, mais ils sont un peu racontai alors voici qu'ils vont comme un ...

Comment assurer la collecte des ordures des nœuds d'arbres qui ne sont pas actuellement affichées à l'aide TreeViewer (SWT.VIRTUAL) et ILazeTreeContentProvider? Si un nœud a 5000 enfants, une fois qu'ils sont affichés par le spectateur, ils ne sont jamais lâcher prise, donc erreur de dépassement de mémoire si votre arbre a un grand nombre de nœuds et leafs et pas assez grand taille du tas. Y at-il une sorte de meilleure pratique comment éviter les fuites de mémoire, causées par vue n'a jamais fermé la tenue d'une TreeViewer avec de grandes quantités de données (des centaines d'objets de milliers, voire des millions)? Peut-être que peut-être il y a une interface de rappel qui permettent une plus grande flexibilité avec des éléments de fournisseur spectateur / contenu?

Est-il possible de combiner deffered (DeferredTreeContentManager) et le chargement paresseux (de ILazyTreeContentProvider) pour un seul TreeViewer (SWT.VIRTUAL)? Autant que je comprends en regardant des exemples et des API, il est possible d'utiliser l'un à un moment donné mais pas les deux en même temps, par exemple , chercher seulement les enfants visibles pour un noeud donné les chercher dans un thread séparé en utilisant l'API d'emploi. Ce qui me dérange est que l'approche différée charge tous les enfants. Bien que dans un autre thread, vous chargez Il reste tous les éléments même si seulement un sous-ensemble minimal sont affichés à la fois.

Je peux donner des exemples de code à mes questions, si nécessaire ...

Je me bats actuellement avec moi-même ceux donc si je parviens à trouver quelque chose en attendant, je serai heureux de le partager ici.

Merci!

Cordialement, Svilen

Était-ce utile?

La solution

Je trouve le cadre Eclipse parfois schizophrène. Je soupçonne que le DeferredTreeContentManager en ce qui concerne la ILazyTreeContentProvider est l'un de ces cas.

Dans un autre exemple, à EclipseCon cette année ils ont recommandé que vous utilisez l'adaptateur usines (IAdapterFactory) pour adapter vos modèles au contexte de liaison nécessaire à l'époque. Par exemple, si vous voulez que votre modèle apparaisse dans un arbre, faire de cette façon.

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

Enregistrez votre adaptateur et le BaseWorkbenchContentProvider trouverez l'adaptation dans l'usine. Merveilleux. Sonne comme un plan.

"Oh by-the-way, lorsque vous avez grands ensembles de données, s'il vous plaît le faire de cette façon", disent-ils:

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

Il se trouve que les premier et deuxième exemples sont non seulement incompatibles, mais ils sont mutuellement exclusifs. Ces deux approches où probablement mises en œuvre par des équipes différentes qui n'ont pas un plan commun ou peut-être l'API est au milieu d'une transition vers un cadre commun. Néanmoins, vous êtes vous-même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top