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/10 04:02:58 UTC
[3/6] 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/release-0.16
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));
}
}
}