سؤال

لدي بالفعل سؤالان لكنهما يرتبطان نوعًا ما ، لذا يذهبون هنا كواحد ...

كيفية ضمان جمع القمامة لعقد الأشجار التي لا يتم عرضها حاليًا باستخدام TreeViewer(SWT.VIRTUAL) و ILazeTreeContentProvider؟ إذا كان لدى العقدة 5000 طفل ، بمجرد عرضها من قبل المشاهد ، فلن يتم تركها أبدًا ، وبالتالي فإن خطأ الذاكرة إذا كانت شجرتك تحتوي على عدد كبير من العقد والأوراق وليست حجمًا كبيرًا بما يكفي. هل هناك نوع من أفضل الممارسات كيفية تجنب تسرب الذاكرة ، الناجم عن عدم إغلاق العرض أبدًا الذي يحمل TreeViewer بكميات كبيرة من البيانات (مئات الآلاف من الكائنات أو حتى الملايين)؟ ربما هناك بعض واجهة رد الاتصال التي تسمح بمزيد من المرونة مع عناصر عارض/محتوى؟

هل من الممكن الجمع بين deffered (DeferredTreeContentManager) وكسول (ILazyTreeContentProvider) التحميل لأحد TreeViewer(SWT.VIRTUAL))؟ بقدر ما أفهم من خلال النظر إلى الأمثلة وواجهة برمجة التطبيقات ، من الممكن فقط استخدام إما في وقت معين ولكن ليس كليًا ، على سبيل المثال ، جلب الأطفال المرئي فقط لعقدة معينة وجلبهم في موضوع منفصل باستخدام Job API. ما يزعجني هو أن النهج المؤجل يحمل جميع الأطفال. على الرغم من أنه في سلسلة رسائل مختلفة ، لا تزال تقوم بتحميل جميع العناصر على الرغم من عرض مجموعة فرعية أقل فقط في وقت واحد.

يمكنني تقديم أمثلة رمز لأسئلتي إذا لزم الأمر ...

أنا أعاني حاليًا مع أولئك بنفسي ، لذا إذا تمكنت من التوصل إلى شيء ما في هذه الأثناء سأشاركه بكل سرور هنا.

شكرًا!

التحيات ، سفيلين

هل كانت مفيدة؟

المحلول

أجد إطار 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);

اتضح أن الأمثلة الأولى والثانية ليست متوافقة فحسب ، بل إنها حصرية بشكل متبادل. هذان النهجان حيث من المحتمل أن يتم تنفيذها من قبل فرق مختلفة لم يكن لديها خطة مشتركة أو ربما تكون واجهة برمجة التطبيقات في منتصف الانتقال إلى إطار مشترك. ومع ذلك ، فأنت وحدك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top