remove cell-slot from recycler-list dom tree reduce layout and create component time, layout async always and dom support clone this
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/72a852b0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/72a852b0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/72a852b0 Branch: refs/heads/website Commit: 72a852b06d22f656d55f82dde9aae131763dbc53 Parents: 9e6bee8 Author: jianbai.gbj <jianbai....@alibaba-inc.com> Authored: Tue Oct 3 20:19:24 2017 +0800 Committer: gurisxie <279483...@qq.com> Committed: Tue Oct 10 12:11:25 2017 +0800 ---------------------------------------------------------------------- .../java/com/taobao/weex/dom/WXDomObject.java | 13 +++++++ .../taobao/weex/dom/WXRecyclerDomObject.java | 3 ++ .../com/taobao/weex/dom/WXTextDomObject.java | 7 +++- .../taobao/weex/ui/component/WXComponent.java | 24 +++++------- .../weex/ui/component/binding/Layouts.java | 25 +++++++++++- .../component/list/template/DomTreeBuilder.java | 33 ++++++++++++---- .../list/template/WXRecyclerTemplateList.java | 41 +++++++------------- 7 files changed, 94 insertions(+), 52 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/72a852b0/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java index 8398a2d..f990792 100644 --- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java +++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java @@ -104,6 +104,8 @@ public class WXDomObject extends CSSNode implements Cloneable,ImmutableDomObject public long mDomThreadNanos; public long mDomThreadTimestamp; + private boolean cloneThis = false; + public void traverseTree(Consumer...consumers){ long startNanos = System.nanoTime(); if (consumers == null) { @@ -598,6 +600,9 @@ public class WXDomObject extends CSSNode implements Cloneable,ImmutableDomObject if (sDestroy.get()) { return null; } + if(cloneThis){ + return this; + } WXDomObject dom = null; try { dom = WXDomObjectFactory.newInstance(mType); @@ -722,4 +727,12 @@ public class WXDomObject extends CSSNode implements Cloneable,ImmutableDomObject public interface Consumer{ void accept(WXDomObject dom); } + + public boolean isCloneThis() { + return cloneThis; + } + + public void setCloneThis(boolean cloneThis) { + this.cloneThis = cloneThis; + } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/72a852b0/android/sdk/src/main/java/com/taobao/weex/dom/WXRecyclerDomObject.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXRecyclerDomObject.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXRecyclerDomObject.java index 11918e8..805ef8e 100644 --- a/android/sdk/src/main/java/com/taobao/weex/dom/WXRecyclerDomObject.java +++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXRecyclerDomObject.java @@ -225,6 +225,9 @@ public class WXRecyclerDomObject extends WXDomObject{ @Override public WXDomObject clone() { + if(isCloneThis()){ + return this; + } WXRecyclerDomObject domObject = (WXRecyclerDomObject) super.clone(); domObject.cellList = cellList; return domObject; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/72a852b0/android/sdk/src/main/java/com/taobao/weex/dom/WXTextDomObject.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXTextDomObject.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXTextDomObject.java index bdcfd39..749afbd 100644 --- a/android/sdk/src/main/java/com/taobao/weex/dom/WXTextDomObject.java +++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXTextDomObject.java @@ -174,7 +174,9 @@ public class WXTextDomObject extends WXDomObject { updateStyleAndText(); spanned = createSpanned(mText); if(hasNewLayout()){ - WXLogUtils.e("TextDom", new IllegalStateException("Previous csslayout was ignored! markLayoutSeen() never called")); + if(WXEnvironment.isApkDebugable()) { + WXLogUtils.w("TextDom", new IllegalStateException("Previous csslayout was ignored! markLayoutSeen() never called")); + } markUpdateSeen(); } super.dirty(); @@ -226,6 +228,9 @@ public class WXTextDomObject extends WXDomObject { @Override public WXTextDomObject clone() { + if(isCloneThis()){ + return this; + } WXTextDomObject dom = null; try { dom = new WXTextDomObject(); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/72a852b0/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java index f735e4e..1d64d5d 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java @@ -1408,14 +1408,6 @@ public abstract class WXComponent<T extends View> implements IWXObject, IWXActi view.setVisibility(View.GONE); } } - if(mDomObj != null){ - WXDomObject domObject = (WXDomObject) mDomObj; - if (TextUtils.equals(visibility, Constants.Value.VISIBLE)) { - domObject.setVisible(true); - } else if (TextUtils.equals(visibility, Constants.Value.HIDDEN)) { - domObject.setVisible(false); - } - } } /** @@ -1819,16 +1811,17 @@ public abstract class WXComponent<T extends View> implements IWXObject, IWXActi this.waste = waste; WXDomObject domObject = (WXDomObject) getDomObject(); if(waste){ + getDomObject().getStyles().put(Constants.Name.VISIBILITY, Constants.Value.HIDDEN); if(domObject.getAttrs().getStatement() == null) { - domObject.setVisible(false); - if (getHostView() != null) { + domObject.setVisible(false); + if (getHostView() != null) { getHostView().setVisibility(View.GONE); - } - return; + } + return; } if(Constants.Value.VISIBLE.equals(domObject.getAttrs().get(Constants.Name.VIF_FALSE))){ - domObject.setVisible(true); - if(getHostView() != null){ + domObject.setVisible(true); + if(getHostView() != null){ getHostView().setVisibility(View.VISIBLE); } }else{ @@ -1840,8 +1833,9 @@ public abstract class WXComponent<T extends View> implements IWXObject, IWXActi }else{ domObject.setVisible(true); if(getHostView() != null){ - getHostView().setVisibility(View.VISIBLE); + getHostView().setVisibility(View.VISIBLE); } + getDomObject().getStyles().put(Constants.Name.VISIBILITY, Constants.Value.VISIBLE); } } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/72a852b0/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java index 1e48ea7..9dea0ff 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java @@ -75,7 +75,6 @@ public class Layouts { asyncTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); //serial executor is better }else{ doSafeLayout(component, templateViewHolder.getLayoutContext()); - Log.e("weex", "weex" + component.getLayoutHeight() + " " + component.getLayoutWidth()); setLayout(component, false); } @@ -140,6 +139,10 @@ public class Layouts { * if force is true, always set layout * */ public static final void setLayout(WXComponent component, boolean force){ + if(component.isWaste()){ + setLayoutWaste(component, force); + return; + } WXDomObject domObject = (WXDomObject) component.getDomObject(); if(domObject.hasUpdate() || force){ domObject.markUpdateSeen(); @@ -162,4 +165,24 @@ public class Layouts { } } } + + private static final void setLayoutWaste(WXComponent component, boolean force){ + WXDomObject domObject = (WXDomObject) component.getDomObject(); + if(domObject.hasUpdate() || force){ + domObject.markUpdateSeen(); + if(domObject.hasUpdate()){ + domObject.markLayoutStateUpdated(); + } + } + if(component instanceof WXVContainer){ + WXVContainer container = (WXVContainer) component; + int count = container.getChildCount(); + for (int i = 0; i < count; ++i) { + WXComponent child = container.getChild(i); + if (child != null) { + setLayoutWaste(child, force); + } + } + } + } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/72a852b0/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/DomTreeBuilder.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/DomTreeBuilder.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/DomTreeBuilder.java index c475195..0aa6cde 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/DomTreeBuilder.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/DomTreeBuilder.java @@ -18,6 +18,7 @@ */ package com.taobao.weex.ui.component.list.template; +import com.taobao.weex.WXEnvironment; import com.taobao.weex.WXSDKManager; import com.taobao.weex.dom.DOMActionContext; import com.taobao.weex.dom.WXDomObject; @@ -25,6 +26,7 @@ import com.taobao.weex.dom.action.TraceableAction; import com.taobao.weex.ui.component.WXComponent; import com.taobao.weex.ui.component.WXComponentFactory; import com.taobao.weex.ui.component.WXVContainer; +import com.taobao.weex.utils.WXLogUtils; /** * Created by furture on 2017/10/2. @@ -40,29 +42,41 @@ class DomTreeBuilder extends TraceableAction { return null; } long startNanos = System.nanoTime(); + dom.setCloneThis(true); WXComponent component = WXComponentFactory.newInstance(context.getInstance(), dom, parent); if (component != null) { component.mTraceInfo.domThreadStart = dom.mDomThreadTimestamp; component.mTraceInfo.rootEventId = mTracingEventId; component.mTraceInfo.domQueueTime = mDomQueueTime; } - ((WXDomObject)component.getDomObject()).applyStyleToNode(); - context.registerDOMObject(dom.getRef(), dom); context.registerComponent(dom.getRef(), component); if (component instanceof WXVContainer) { WXVContainer container = (WXVContainer) component; WXDomObject parentDom = (WXDomObject) container.getDomObject(); - int count = dom.childCount(); - WXDomObject child = null; - for (int i = 0; i < count; ++i) { - child = dom.getChild(i); + for (int i = 0; i < dom.childCount(); ++i) { + WXDomObject child = dom.getChild(i); if (child != null) { WXComponent childComponent = generateComponentTree(context, child, container); container.addChild(childComponent); - parentDom.add((WXDomObject) childComponent.getDomObject(), -1); + WXDomObject childDomObject = (WXDomObject) childComponent.getDomObject(); + if(childDomObject != child) { + int index = parentDom.index(child); + parentDom.add(childDomObject, index); + if(index >= 0) { + parentDom.remove(child); + i--; + } + RuntimeException exception = new IllegalArgumentException(childDomObject.getClass().getName() + + " not support clone this"); + WXLogUtils.e("weex", exception); + if(WXEnvironment.isApkDebugable()){ + throw exception; + } + } } } } + dom.setCloneThis(false); if (component != null) { component.mTraceInfo.domThreadNanos = System.nanoTime() - startNanos; } @@ -74,8 +88,11 @@ class DomTreeBuilder extends TraceableAction { if(domActionContext == null){ return null; } - domObject.getStyles().put("display", "flex"); DomTreeBuilder builder = new DomTreeBuilder(); + domObject.traverseTree( + domActionContext.getAddDOMConsumer(), + domActionContext.getApplyStyleConsumer() + ); return builder.generateComponentTree(domActionContext, domObject, parent); } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/72a852b0/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/WXRecyclerTemplateList.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/WXRecyclerTemplateList.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/WXRecyclerTemplateList.java index d371ab2..7e0746b 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/WXRecyclerTemplateList.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/WXRecyclerTemplateList.java @@ -197,12 +197,15 @@ public class WXRecyclerTemplateList extends WXVContainer<BounceRecyclerView> imp listData = array; } } - + long start = System.currentTimeMillis(); if(mDomObject != null && mDomObject.getCellList() != null){ for(int i=0; i<mDomObject.getCellList().size(); i++){ addChild(DomTreeBuilder.buildTree(mDomObject.getCellList().get(i), this)); } } + if(WXEnvironment.isApkDebugable()){ + WXLogUtils.d(TAG, "TemplateList BuildDomTree Used " + (System.currentTimeMillis() - start)); + } } @Override @@ -1003,18 +1006,10 @@ public class WXRecyclerTemplateList extends WXVContainer<BounceRecyclerView> imp return; } long start = System.currentTimeMillis(); - boolean async = templateViewHolder.getHolderPosition() >= 0; + boolean resuse = templateViewHolder.getHolderPosition() >= 0; templateViewHolder.setHolderPosition(position); Object data = listData.get(position); if(component.getRenderData() == data){ - if(!async){ - if(!component.isHasLayout()) { - Layouts.doLayoutAsync(templateViewHolder, async); - } - if(WXEnvironment.isApkDebugable()){ - WXLogUtils.d(TAG, position + getTemplateKey(position) + " onBindViewHolder source layout used " + (System.currentTimeMillis() - start) + async); - } - } component.setHasLayout(true); }else{ List<WXComponent> updates = Statements.doRender(component, getStackContextForPosition(position, data)); @@ -1024,12 +1019,12 @@ public class WXRecyclerTemplateList extends WXVContainer<BounceRecyclerView> imp WXLogUtils.d(TAG, position + getTemplateKey(position) + " onBindViewHolder render used " + (System.currentTimeMillis() - start)); } if(component.isHasLayout()){ - async = true; + resuse = true; } - Layouts.doLayoutAsync(templateViewHolder, async); + Layouts.doLayoutAsync(templateViewHolder, true); component.setHasLayout(true); if(WXEnvironment.isApkDebugable()){ - WXLogUtils.d(TAG, position + getTemplateKey(position) + " onBindViewHolder layout used " + (System.currentTimeMillis() - start) + async); + WXLogUtils.d(TAG, position + getTemplateKey(position) + " onBindViewHolder layout used " + (System.currentTimeMillis() - start) + resuse); } } } @@ -1097,6 +1092,7 @@ public class WXRecyclerTemplateList extends WXVContainer<BounceRecyclerView> imp WXCellDomObject domObject = (WXCellDomObject) component.getDomObject(); domObject.setRecyclerDomObject((WXRecyclerDomObject) getDomObject()); } + component.setRenderData(cell.getRenderData()); return component; } @@ -1109,8 +1105,8 @@ public class WXRecyclerTemplateList extends WXVContainer<BounceRecyclerView> imp if(cell == getSourceTemplate(i)){ Object data = listData.get(i); Statements.doRender(cell, getStackContextForPosition(i, data)); + Layouts.doSafeLayout(cell, new CSSLayoutContext()); cell.setRenderData(data); - //WXSDKManager.getInstance().getWXDomManager().postAction(getInstanceId(), new RenderSourceCellAction(cell, null, data), false); break; } } @@ -1560,7 +1556,7 @@ public class WXRecyclerTemplateList extends WXVContainer<BounceRecyclerView> imp cellCache = new TemplateCache(); mTemplatesCache.put(template, cellCache); } - if(cellCache.cells.size() >= templateCacheSize){ + if(cellCache.cells.size() > 0){ cellCache.isLoadIng = false; return; } @@ -1571,11 +1567,6 @@ public class WXRecyclerTemplateList extends WXVContainer<BounceRecyclerView> imp AsyncTask<Void,Void, Void> preloadTask = new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } TemplateCache cellCache = mTemplatesCache.get(template); if(cellCache == null || cellCache.cells == null){ return null; @@ -1620,10 +1611,6 @@ public class WXRecyclerTemplateList extends WXVContainer<BounceRecyclerView> imp doInitLazyCell(component, template, true); return iterator.hasNext(); } - if(!component.isHasLayout()){ - Layouts.doSafeLayout(component, new CSSLayoutContext()); - component.setHasLayout(true); - } } return false; } @@ -1640,15 +1627,15 @@ public class WXRecyclerTemplateList extends WXVContainer<BounceRecyclerView> imp component.lazy(false); component.createView(); if(WXEnvironment.isApkDebugable()) { - WXLogUtils.d(TAG, "doInitLazyCell " + inPreload + template + " createView used " + (System.currentTimeMillis() - start)); + WXLogUtils.d(TAG, "doInitLazyCell idle" + inPreload + template + " createView used " + (System.currentTimeMillis() - start)); } component.applyLayoutAndEvent(component); if(WXEnvironment.isApkDebugable()) { - WXLogUtils.d(TAG, "doInitLazyCell " + inPreload + template + " apply layout used " + (System.currentTimeMillis() - start)); + WXLogUtils.d(TAG, "doInitLazyCell idle" + inPreload + template + " apply layout used " + (System.currentTimeMillis() - start)); } component.bindData(component); if(WXEnvironment.isApkDebugable()) { - WXLogUtils.d(TAG, "doInitLazyCell " + inPreload + template + " bindData used " + (System.currentTimeMillis() - start)); + WXLogUtils.d(TAG, "doInitLazyCell idle" + inPreload + template + " bindData used " + (System.currentTimeMillis() - start)); } } }