You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ky...@apache.org on 2017/09/13 09:41:32 UTC
[08/12] incubator-weex git commit: + [android] Add garbage collection
for FlatGUI.
+ [android] Add garbage collection for FlatGUI.
* [android] Fix the problem of WXSDKInstance.destroy() invoked twice if WXEmbed present.
WXSDKInstance.destroy() will be called by
WXSDKInstance.onActivityDestroy()->WXEmbed.onActivityDestroy() ->WXSDKInstance.onActivityDestroy() -> WXSDKInstance.destroy() and
WXSDKInstance.onActivityDestroy() -> WXSDKInstance.destroy() -> WXEmbed.destroy() -> WXSDKInstance.destroy().
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/94b4d418
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/94b4d418
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/94b4d418
Branch: refs/heads/0.16-dev
Commit: 94b4d41801b0388c58c82f2e2dd7e1b1a4fd5a6d
Parents: 67ea398
Author: YorkShen <sh...@gmail.com>
Authored: Fri Sep 8 11:42:33 2017 +0800
Committer: YorkShen <sh...@gmail.com>
Committed: Wed Sep 13 16:55:19 2017 +0800
----------------------------------------------------------------------
.../java/com/taobao/weex/WXSDKInstance.java | 68 +++++++++++---------
.../com/taobao/weex/ui/component/WXDiv.java | 4 +-
.../taobao/weex/ui/component/list/WXCell.java | 4 +-
.../com/taobao/weex/ui/flat/FlatGUIContext.java | 24 +++++--
.../weex/ui/flat/widget/AndroidViewWidget.java | 10 ++-
5 files changed, 71 insertions(+), 39 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/94b4d418/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index 93191a8..69fc649 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -18,6 +18,8 @@
*/
package com.taobao.weex;
+import static com.taobao.weex.http.WXHttpUtil.KEY_USER_AGENT;
+
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
@@ -36,7 +38,6 @@ import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ScrollView;
-
import com.alibaba.fastjson.JSONObject;
import com.taobao.weex.adapter.IDrawableLoader;
import com.taobao.weex.adapter.IWXHttpAdapter;
@@ -79,7 +80,6 @@ import com.taobao.weex.utils.WXJsonUtils;
import com.taobao.weex.utils.WXLogUtils;
import com.taobao.weex.utils.WXReflectionUtils;
import com.taobao.weex.utils.WXViewUtils;
-
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
@@ -88,8 +88,6 @@ import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
-import static com.taobao.weex.http.WXHttpUtil.KEY_USER_AGENT;
-
/**
* Each instance of WXSDKInstance represents an running weex instance.
* It can be a pure weex view, or mixed with native view
@@ -121,8 +119,8 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
private boolean mNeedReLoad = false;
private static volatile int mViewPortWidth = 750;
private int mInstanceViewPortWidth = 750;
- private final @NonNull
- FlatGUIContext mUIImp =new FlatGUIContext();
+ private @NonNull
+ FlatGUIContext mFlatGUIContext =new FlatGUIContext();
public long mRenderStartNanos;
public int mExecJSTraceId = WXTracing.nextId();
@@ -203,9 +201,10 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
enableLayerType = enable;
}
+ @RestrictTo(Scope.LIBRARY)
public @NonNull
FlatGUIContext getFlatUIContext(){
- return mUIImp;
+ return mFlatGUIContext;
}
public boolean isNeedValidate() {
@@ -1258,36 +1257,41 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
}
public synchronized void destroy() {
- WXSDKManager.getInstance().destroyInstance(mInstanceId);
- WXComponentFactory.removeComponentTypesByInstanceId(getInstanceId());
+ if(!isDestroy()) {
+ WXSDKManager.getInstance().destroyInstance(mInstanceId);
+ WXComponentFactory.removeComponentTypesByInstanceId(getInstanceId());
- if(mGlobalEventReceiver!=null){
- getContext().unregisterReceiver(mGlobalEventReceiver);
- mGlobalEventReceiver=null;
- }
- if(mRootComp != null ) {
- mRootComp.destroy();
- destroyView(mRenderContainer);
- mRootComp = null;
- }
+ if (mGlobalEventReceiver != null) {
+ getContext().unregisterReceiver(mGlobalEventReceiver);
+ mGlobalEventReceiver = null;
+ }
+ if (mRootComp != null) {
+ mRootComp.destroy();
+ destroyView(mRenderContainer);
+ mRootComp = null;
+ }
- if(mGlobalEvents!=null){
- mGlobalEvents.clear();
- }
+ if (mGlobalEvents != null) {
+ mGlobalEvents.clear();
+ }
- if(mComponentObserver != null){
+ if (mComponentObserver != null) {
mComponentObserver = null;
+ }
+
+ getFlatUIContext().destroy();
+ mFlatGUIContext = null;
+
+ mWXScrollListeners = null;
+ mRenderContainer = null;
+ mNestedInstanceInterceptor = null;
+ mUserTrackAdapter = null;
+ mScrollView = null;
+ mContext = null;
+ mRenderListener = null;
+ isDestroy = true;
+ mStatisticsListener = null;
}
-
- mWXScrollListeners = null;
- mRenderContainer = null;
- mNestedInstanceInterceptor = null;
- mUserTrackAdapter = null;
- mScrollView = null;
- mContext = null;
- mRenderListener = null;
- isDestroy = true;
- mStatisticsListener = null;
}
public boolean isDestroy(){
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/94b4d418/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java
index bdc9891..b9b97e1 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java
@@ -100,7 +100,9 @@ public class WXDiv extends WidgetContainer<WXFrameLayout> implements FlatCompone
@Override
public void unmountFlatGUI() {
- //TODO unmout must be called before you mount FlatGUI second times.
+ if (getHostView() != null) {
+ getHostView().unmountFlatGUI();
+ }
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/94b4d418/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
index bf575b5..6ba985f 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
@@ -169,7 +169,9 @@ public class WXCell extends WidgetContainer<WXFrameLayout> {
@Override
public void unmountFlatGUI() {
-
+ if (getHostView() != null) {
+ getHostView().unmountFlatGUI();
+ }
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/94b4d418/android/sdk/src/main/java/com/taobao/weex/ui/flat/FlatGUIContext.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/flat/FlatGUIContext.java b/android/sdk/src/main/java/com/taobao/weex/ui/flat/FlatGUIContext.java
index e208f4c..4004bc8 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/flat/FlatGUIContext.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/flat/FlatGUIContext.java
@@ -27,6 +27,7 @@ import android.support.v4.util.ArrayMap;
import android.text.TextUtils;
import android.view.View;
import com.taobao.weex.common.Constants.Name;
+import com.taobao.weex.common.Destroyable;
import com.taobao.weex.dom.ImmutableDomObject;
import com.taobao.weex.dom.WXAttr;
import com.taobao.weex.dom.WXDomObject;
@@ -35,12 +36,12 @@ import com.taobao.weex.ui.component.WXComponent;
import com.taobao.weex.ui.flat.widget.AndroidViewWidget;
import com.taobao.weex.ui.flat.widget.Widget;
import java.util.Map;
+import java.util.Map.Entry;
-//TODO when Weex instance is destroyed, there is a work of garbage collection.
//TODO The constructor of FlatGUIContext should have a flag decide whether to enable flagGUI.
@RestrictTo(Scope.LIBRARY)
-public class FlatGUIContext {
+public class FlatGUIContext implements Destroyable{
private Map<WXComponent, WidgetContainer> mWidgetRegistry = new ArrayMap<>();
private Map<WXComponent, AndroidViewWidget> mViewWidgetRegistry = new ArrayMap<>();
@@ -99,6 +100,22 @@ public class FlatGUIContext {
return ret;
}
+ @Override
+ @RestrictTo(Scope.LIBRARY)
+ public void destroy(){
+ widgetToComponent.clear();
+
+ for(Entry<WXComponent, AndroidViewWidget> entry: mViewWidgetRegistry.entrySet()){
+ entry.getValue().destroy();
+ }
+ mViewWidgetRegistry.clear();
+
+ for(Entry<WXComponent, WidgetContainer> entry:mWidgetRegistry.entrySet()){
+ entry.getValue().unmountFlatGUI();
+ }
+ mWidgetRegistry.clear();
+ }
+
private @Nullable WXComponent getComponent(@NonNull Widget widget){
return widgetToComponent.get(widget);
}
@@ -109,14 +126,13 @@ public class FlatGUIContext {
if (domObject != null) {
WXStyle style = domObject.getStyles();
WXAttr attr = domObject.getAttrs();
- //TODO disabled && pro_fixed_size, attr or style
if (style.containsKey(Name.OPACITY) ||
style.containsKey(Name.TRANSFORM) ||
+ style.containsKey(Name.VISIBILITY) ||
attr.containsKey(Name.ELEVATION) ||
attr.containsKey(Name.ARIA_HIDDEN) ||
attr.containsKey(Name.ARIA_LABEL) ||
attr.containsKey(WXComponent.PROP_FIXED_SIZE) ||
- style.containsKey(Name.VISIBILITY) ||
attr.containsKey(Name.DISABLED) ||
style.isFixed() ||
style.isSticky() ||
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/94b4d418/android/sdk/src/main/java/com/taobao/weex/ui/flat/widget/AndroidViewWidget.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/flat/widget/AndroidViewWidget.java b/android/sdk/src/main/java/com/taobao/weex/ui/flat/widget/AndroidViewWidget.java
index 3edba74..0610a8e 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/flat/widget/AndroidViewWidget.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/flat/widget/AndroidViewWidget.java
@@ -25,10 +25,11 @@ import android.support.annotation.Nullable;
import android.support.annotation.RestrictTo;
import android.support.annotation.RestrictTo.Scope;
import android.view.View;
+import com.taobao.weex.common.Destroyable;
import com.taobao.weex.ui.flat.FlatGUIContext;
@RestrictTo(Scope.LIBRARY)
-public class AndroidViewWidget extends BaseWidget {
+public class AndroidViewWidget extends BaseWidget implements Destroyable {
private @Nullable View mView;
public AndroidViewWidget(@NonNull FlatGUIContext context) {
@@ -65,4 +66,11 @@ public class AndroidViewWidget extends BaseWidget {
public @Nullable View getView() {
return mView;
}
+
+ @Override
+ public void destroy() {
+ if (mView != null) {
+ mView = null;
+ }
+ }
}