This is an automated email from the ASF dual-hosted git repository.
harbs pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
The following commit(s) were added to refs/heads/develop by this push:
new 4e186b7442 Added factory for reusing data item renderers
4e186b7442 is described below
commit 4e186b7442872764e27f086a3a03863f09c599aa
Author: Harbs <[email protected]>
AuthorDate: Thu Dec 21 01:31:18 2023 +0200
Added factory for reusing data item renderers
---
.../Basic/src/main/resources/basic-manifest.xml | 1 +
.../projects/Basic/src/main/royale/BasicClasses.as | 1 +
.../DataItemRendererFactoryForCollectionView.as | 2 +
...bleDataItemRendererFactoryForCollectionView.as} | 113 ++++++---------------
4 files changed, 34 insertions(+), 83 deletions(-)
diff --git a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
index dc0d7bfd00..51a682c0e4 100644
--- a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
+++ b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
@@ -228,6 +228,7 @@
<component id="DynamicUpdateItemRendererForArrayListData"
class="org.apache.royale.html.beads.DynamicUpdateItemRendererForArrayListData"/>
<component id="DataItemRendererFactoryForHierarchicalData"
class="org.apache.royale.html.beads.DataItemRendererFactoryForHierarchicalData"
/>
<component id="DataItemRendererFactoryForCollectionView"
class="org.apache.royale.html.beads.DataItemRendererFactoryForCollectionView" />
+ <component id="ReusableDataItemRendererFactoryForCollectionView"
class="org.apache.royale.html.beads.ReusableDataItemRendererFactoryForCollectionView"
/>
<component id="SelectionDataItemRendererFactoryForCollectionView"
class="org.apache.royale.html.beads.SelectionDataItemRendererFactoryForCollectionView"
/>
<component id="DynamicRemoveAllItemRendererForArrayListData"
class="org.apache.royale.html.beads.DynamicRemoveAllItemRendererForArrayListData"
/>
<component id="DynamicRemoveAllByNullItemRendererForArrayListData"
class="org.apache.royale.html.beads.DynamicRemoveAllByNullItemRendererForArrayListData"
/>
diff --git a/frameworks/projects/Basic/src/main/royale/BasicClasses.as
b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
index f5591dcad6..91a45a7911 100644
--- a/frameworks/projects/Basic/src/main/royale/BasicClasses.as
+++ b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
@@ -245,6 +245,7 @@ internal class BasicClasses
import
org.apache.royale.html.beads.DataItemRendererFactoryForArrayList;
DataItemRendererFactoryForArrayList;
import
org.apache.royale.html.beads.DataItemRendererFactoryForHierarchicalData;
DataItemRendererFactoryForHierarchicalData;
import
org.apache.royale.html.beads.DataItemRendererFactoryForCollectionView;
DataItemRendererFactoryForCollectionView;
+ import
org.apache.royale.html.beads.ReusableDataItemRendererFactoryForCollectionView;
ReusableDataItemRendererFactoryForCollectionView;
import org.apache.royale.html.supportClasses.DataGroup; DataGroup;
import org.apache.royale.html.supportClasses.Border; Border;
import org.apache.royale.html.supportClasses.Viewport; Viewport;
diff --git
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
index de128b771e..07b387c7a0 100644
---
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
+++
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
@@ -77,6 +77,7 @@ package org.apache.royale.html.beads
* @royaleignorecoercion
org.apache.royale.collections.ICollectionView
* @royaleignorecoercion
org.apache.royale.core.IListPresentationModel
* @royaleignorecoercion
org.apache.royale.core.IIndexedItemRenderer
+ * @royaleignorecoercion
org.apache.royale.core.IIndexedItemRendererInitializer
* @royaleignorecoercion
org.apache.royale.core.IStrandWithModelView
* @royaleignorecoercion org.apache.royale.html.beads.IListView
*/
@@ -152,6 +153,7 @@ package org.apache.royale.html.beads
* @private
* @royaleignorecoercion
org.apache.royale.collections.ICollectionView
* @royaleignorecoercion
org.apache.royale.core.IIndexedItemRenderer
+ * @royaleignorecoercion
org.apache.royale.core.IIndexedItemRendererInitializer
* @royaleignorecoercion
org.apache.royale.core.IStrandWithModelView
* @royaleignorecoercion org.apache.royale.html.beads.IListView
*/
diff --git
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/ReusableDataItemRendererFactoryForCollectionView.as
similarity index 58%
copy from
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
copy to
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/ReusableDataItemRendererFactoryForCollectionView.as
index de128b771e..d697b26632 100644
---
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
+++
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/ReusableDataItemRendererFactoryForCollectionView.as
@@ -18,76 +18,55 @@
////////////////////////////////////////////////////////////////////////////////
package org.apache.royale.html.beads
{
+ import org.apache.royale.utils.sendStrandEvent;
+ import org.apache.royale.events.CollectionEvent;
+ import org.apache.royale.core.IStrandWithModelView;
import org.apache.royale.core.IIndexedItemRenderer;
import org.apache.royale.core.IIndexedItemRendererInitializer;
import org.apache.royale.core.IItemRendererOwnerView;
- import org.apache.royale.core.IStrandWithModelView;
- import org.apache.royale.events.CollectionEvent;
- import org.apache.royale.events.Event;
- import org.apache.royale.events.IEventDispatcher;
- import org.apache.royale.html.beads.IListView;
- import org.apache.royale.utils.sendStrandEvent;
-
/**
- * This class creates itemRenderer instances from the data contained
within an ICollectionView
+ * The ReusableDataItemRendererFactoryForCollectionView class will save
removed itemRenderers
+ * and reuse them when new item renderers are needed. This is useful
for large collections
+ * where creating new item renderers can be expensive. Using this class
can drastically
+ * reduce rendering time at the expense of preventing the unused item
renderers from being
+ * garbage collected.
+ *
+ * In an unscientific test, using this class reduced rendering time by
about a factor of 100 in some cases.
+ *
+ * Item renderers must be able to be reused. Resetting the data
property must properly reset the state and
+ * clean any event listeners from the old state.
*/
- public class DataItemRendererFactoryForCollectionView extends
DataItemRendererFactoryBase
+ public class ReusableDataItemRendererFactoryForCollectionView extends
DataItemRendererFactoryForCollectionView
{
- public function
DataItemRendererFactoryForCollectionView(target:Object = null)
+ public function
ReusableDataItemRendererFactoryForCollectionView(target:Object = null)
{
super(target);
}
-
- /**
- * the dataProvider as a dispatcher
- */
- protected var dped:IEventDispatcher;
+
+ private var _unusedRenderers:Array = [];
/**
* @private
* @royaleignorecoercion
org.apache.royale.collections.ICollectionView
* @royaleignorecoercion
org.apache.royale.core.IListPresentationModel
* @royaleignorecoercion
org.apache.royale.core.IIndexedItemRenderer
- * @royaleignorecoercion
org.apache.royale.events.IEventDispatcher
- */
- override protected function
dataProviderChangeHandler(event:Event):void
- {
- super.dataProviderChangeHandler(event);
-
- if(dped)
- {
-
dped.removeEventListener(CollectionEvent.ITEM_ADDED, itemAddedHandler);
-
dped.removeEventListener(CollectionEvent.ITEM_REMOVED, itemRemovedHandler);
-
dped.removeEventListener(CollectionEvent.ITEM_UPDATED, itemUpdatedHandler);
- dped = null;
- }
-
- if (!dataProviderModel.dataProvider)
- return;
-
- // listen for individual items being added in the
future.
- dped = dataProviderModel.dataProvider as
IEventDispatcher;
- dped.addEventListener(CollectionEvent.ITEM_ADDED,
itemAddedHandler);
- dped.addEventListener(CollectionEvent.ITEM_REMOVED,
itemRemovedHandler);
- dped.addEventListener(CollectionEvent.ITEM_UPDATED,
itemUpdatedHandler);
- }
-
- /**
- * @private
- * @royaleignorecoercion
org.apache.royale.collections.ICollectionView
- * @royaleignorecoercion
org.apache.royale.core.IListPresentationModel
- * @royaleignorecoercion
org.apache.royale.core.IIndexedItemRenderer
+ * @royaleignorecoercion
org.apache.royale.core.IIndexedItemRendererInitializer
* @royaleignorecoercion
org.apache.royale.core.IStrandWithModelView
* @royaleignorecoercion org.apache.royale.html.beads.IListView
*/
- protected function itemAddedHandler(event:CollectionEvent):void
+ override protected function
itemAddedHandler(event:CollectionEvent):void
{
if(!dataProviderExist)
return;
var view:IListView = (_strand as
IStrandWithModelView).view as IListView;
var dataGroup:IItemRendererOwnerView = view.dataGroup;
- var ir:IIndexedItemRenderer =
itemRendererFactory.createItemRenderer() as IIndexedItemRenderer;
+ var ir:IIndexedItemRenderer;
+ if(_unusedRenderers.length > 0)
+ ir = _unusedRenderers.pop();
+
+ else
+ ir = itemRendererFactory.createItemRenderer()
as IIndexedItemRenderer;
var data:Object = event.item;
dataGroup.addItemRendererAt(ir, event.index);
@@ -108,7 +87,8 @@ package org.apache.royale.html.beads
}
sendStrandEvent(_strand,"itemsCreated");
- sendStrandEvent(_strand,"layoutNeeded");
+ // The itemsCreated handler sends layoutNeeded, so no
need to do it here.
+ // sendStrandEvent(_strand,"layoutNeeded");
}
/**
@@ -119,7 +99,7 @@ package org.apache.royale.html.beads
* @royaleignorecoercion
org.apache.royale.core.IStrandWithModelView
* @royaleignorecoercion org.apache.royale.html.beads.IListView
*/
- protected function
itemRemovedHandler(event:CollectionEvent):void
+ override protected function
itemRemovedHandler(event:CollectionEvent):void
{
if(!dataProviderExist)
return;
@@ -130,7 +110,7 @@ package org.apache.royale.html.beads
var ir:IIndexedItemRenderer =
dataGroup.getItemRendererAt(event.index) as IIndexedItemRenderer;
if (!ir) return; // may have already been cleaned up,
possibly when a tree node closes
dataGroup.removeItemRenderer(ir);
-
+ _unusedRenderers.push(ir);
// adjust the itemRenderers' index to adjust for the
shift
var n:int = dataGroup.numItemRenderers;
for (var i:int = event.index; i < n; i++)
@@ -147,39 +127,6 @@ package org.apache.royale.html.beads
sendStrandEvent(_strand,"layoutNeeded");
}
-
- /**
- * @private
- * @royaleignorecoercion
org.apache.royale.collections.ICollectionView
- * @royaleignorecoercion
org.apache.royale.core.IIndexedItemRenderer
- * @royaleignorecoercion
org.apache.royale.core.IStrandWithModelView
- * @royaleignorecoercion org.apache.royale.html.beads.IListView
- */
- protected function
itemUpdatedHandler(event:CollectionEvent):void
- {
- if(!dataProviderExist)
- return;
-
- var view:IListView = (_strand as
IStrandWithModelView).view as IListView;
- var dataGroup:IItemRendererOwnerView = view.dataGroup;
-
- // update the given renderer with (possibly) new
information so it can change its
- // appearence or whatever.
- var ir:IIndexedItemRenderer =
dataGroup.getItemRendererAt(event.index) as IIndexedItemRenderer;
-
- var data:Object = event.item;
- (itemRendererInitializer as
IIndexedItemRendererInitializer).initializeIndexedItemRenderer(ir, data,
event.index);
- ir.data = data;
- }
-
- override protected function get dataProviderLength():int
- {
- return dataProviderModel.dataProvider.length;
- }
-
- override protected function getItemAt(i:int):Object
- {
- return dataProviderModel.dataProvider.getItemAt(i);
- }
+
}
}
\ No newline at end of file