9

実際には2つの質問がありますが、それらは一種の関連性があるため、ここでは1つにします...

TreeViewer( SWT.VIRTUAL) とを使用して現在表示されていないツリー ノードのガベージ コレクションを確実に行う方法はILazeTreeContentProvider? ノードに 5000 の子がある場合、それらがビューアーによって表示されると決して手放されないため、ツリーに多数のノードとリーフがあり、十分なヒープ サイズがない場合、メモリ不足エラーが発生します。大量のデータ (数十万または数百万のオブジェクト) を持つツリービューアーを保持している閉じられていないビューによって引き起こされるメモリ リークを回避するためのベスト プラクティスはありますか? おそらく、ビューアー/コンテンツ プロバイダー要素をより柔軟に使用できるコールバック インターフェイスがいくつかあるのではないでしょうか?

単一の( ) に対して、deffered ( DeferredTreeContentManager) と lazy ( ILazyTreeContentProvider) の読み込みを組み合わせることは可能ですか? 例と API を見て理解した限りでは、特定の時点でどちらか一方しか使用できず、両方を組み合わせて使用​​することはできません。たとえば、特定のノードの可視の子のみをフェッチし、Job を使用して別のスレッドでそれらをフェッチします。 API。私を悩ませているのは、遅延アプローチがすべての子をロードすることです。別のスレッドではありますが、一度に最小限のサブセットのみが表示される場合でも、すべての要素をロードします。TreeViewerSWT.VIRTUAL

必要に応じて、質問にコード例を提供できます...

私は現在それらに苦労しているので、その間に何かを思い付くことができれば、ここで喜んで共有します.

ありがとう!

よろしく、 スヴィレン

4

1 に答える 1

11

Eclipse フレームワークは統合失調症のように感じることがあります。DeferredTreeContentManagerに関連するILazyTreeContentProviderは、これらのケースの1つであると思われます。

別の例として、昨年の 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);

最初と 2 番目の例は互換性がないだけでなく、相互に排他的であることがわかります。これらの 2 つのアプローチは、おそらく共通の計画を持たない別のチームによって実装されたか、API が共通のフレームワークへの移行の途中にある可能性があります。それにもかかわらず、あなたは自分自身です。

于 2009-11-25T19:57:59.480 に答える