+ [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 <shenyua...@gmail.com>
Authored: Fri Sep 8 11:42:33 2017 +0800
Committer: YorkShen <shenyua...@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;
+    }
+  }
 }

Reply via email to