+ [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; + } + } }