You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by gu...@apache.org on 2017/10/18 04:16:56 UTC

[18/50] [abbrv] incubator-weex git commit: remove cell-slot from recycler-list dom tree reduce layout and create component time, layout async always and dom support clone this

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/9c1f2983
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/9c1f2983
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/9c1f2983

Branch: refs/heads/master
Commit: 9c1f2983e126f25956e3720b1149e1a633ea941b
Parents: 6849d52
Author: jianbai.gbj <ji...@alibaba-inc.com>
Authored: Tue Oct 3 20:19:24 2017 +0800
Committer: gurisxie <27...@qq.com>
Committed: Tue Oct 10 12:02:29 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/9c1f2983/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/9c1f2983/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/9c1f2983/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/9c1f2983/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/9c1f2983/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/9c1f2983/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/9c1f2983/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));
             }
         }
     }