From 482d5f897658d85909c1f9a919e63e332de33c91 Mon Sep 17 00:00:00 2001 From: maxli Date: Mon, 12 Aug 2024 10:56:38 +0800 Subject: [PATCH 1/2] fix(android): delete virtual child node when parent deleted --- .../mtt/hippy/uimanager/RenderManager.java | 16 +++++++++++++++- .../java/com/tencent/renderer/NativeRender.java | 2 ++ .../com/tencent/renderer/NativeRenderer.java | 5 +++++ .../tencent/renderer/node/RootRenderNode.java | 5 +++-- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/RenderManager.java b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/RenderManager.java index 85676097fd3..4e6f9ae199f 100644 --- a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/RenderManager.java +++ b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/RenderManager.java @@ -16,10 +16,10 @@ package com.tencent.mtt.hippy.uimanager; +import static com.tencent.mtt.hippy.dom.node.NodeProps.TEXT_CLASS_NAME; import static com.tencent.renderer.NativeRenderer.NODE_ID; import static com.tencent.renderer.NativeRenderer.NODE_INDEX; import static com.tencent.renderer.node.RenderNode.FLAG_ALREADY_DELETED; -import static com.tencent.renderer.node.RenderNode.FLAG_LAZY_LOAD; import static com.tencent.renderer.node.RenderNode.FLAG_UPDATE_TOTAL_PROPS; import android.content.Context; @@ -29,6 +29,7 @@ import androidx.annotation.NonNull; import com.openhippy.pool.BasePool.PoolType; +import com.tencent.renderer.NativeRender; import com.tencent.renderer.NativeRenderContext; import com.tencent.renderer.NativeRendererManager; import com.tencent.renderer.Renderer; @@ -39,6 +40,7 @@ import com.tencent.renderer.node.TextRenderNode; import com.tencent.renderer.node.RenderNode; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -66,8 +68,11 @@ public class RenderManager { private final ControllerManager mControllerManager; @NonNull private final Map> mUIUpdateNodes = new HashMap<>(); + @Nullable + private final WeakReference mRendererWeakRef; public RenderManager(Renderer renderer) { + mRendererWeakRef = new WeakReference<>(renderer); mControllerManager = new ControllerManager(renderer); } @@ -381,6 +386,12 @@ private void deleteSelfFromParent(int rootId, @Nullable RenderNode node) { node.getParent().removeChild(node); } removeRenderNode(rootId, node.getId()); + if (node.getClassName().equals(TEXT_CLASS_NAME)) { + Renderer renderer = mRendererWeakRef.get(); + if (renderer instanceof NativeRender) { + ((NativeRender) renderer).deleteVirtualChildNode(rootId, node.getId()); + } + } node.setNodeFlag(FLAG_ALREADY_DELETED); node.onDeleted(); } @@ -389,6 +400,9 @@ private void removeRenderNode(int rootId, int nodeId) { RootRenderNode rootNode = NativeRendererManager.getRootNode(rootId); if (rootId == nodeId) { NativeRendererManager.removeRootNode(rootId); + if (rootNode != null) { + rootNode.clear(); + } } if (rootNode != null) { rootNode.removeRenderNode(nodeId); diff --git a/renderer/native/android/src/main/java/com/tencent/renderer/NativeRender.java b/renderer/native/android/src/main/java/com/tencent/renderer/NativeRender.java index 0a3e18eeb4c..64dfbffe267 100644 --- a/renderer/native/android/src/main/java/com/tencent/renderer/NativeRender.java +++ b/renderer/native/android/src/main/java/com/tencent/renderer/NativeRender.java @@ -67,6 +67,8 @@ public interface NativeRender extends RenderExceptionHandler, RenderLogHandler { @Nullable BaseEngineContext getEngineContext(); + void deleteVirtualChildNode(int rootId, int nodeId); + int getEngineId(); /** diff --git a/renderer/native/android/src/main/java/com/tencent/renderer/NativeRenderer.java b/renderer/native/android/src/main/java/com/tencent/renderer/NativeRenderer.java index 70d5badc961..d328690f033 100644 --- a/renderer/native/android/src/main/java/com/tencent/renderer/NativeRenderer.java +++ b/renderer/native/android/src/main/java/com/tencent/renderer/NativeRenderer.java @@ -635,6 +635,11 @@ public void updateNode(final int rootId, @NonNull List nodeList) } } + @Override + public void deleteVirtualChildNode(int rootId, int nodeId) { + mVirtualNodeManager.deleteNode(rootId, nodeId); + } + @Override public void deleteNode(final int rootId, @NonNull int[] ids) throws NativeRenderException { final List taskList = new ArrayList<>(ids.length); diff --git a/renderer/native/android/src/main/java/com/tencent/renderer/node/RootRenderNode.java b/renderer/native/android/src/main/java/com/tencent/renderer/node/RootRenderNode.java index 6952fce7e72..149187c0b19 100644 --- a/renderer/native/android/src/main/java/com/tencent/renderer/node/RootRenderNode.java +++ b/renderer/native/android/src/main/java/com/tencent/renderer/node/RootRenderNode.java @@ -23,12 +23,13 @@ import com.tencent.renderer.utils.ChoreographerUtils; import java.util.Map; import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; public class RootRenderNode extends RenderNode { private final int mRendererId; private final SparseArray mNodes = new SparseArray<>(80); - private final SparseArray mVirtualNodes = new SparseArray<>(40); + private final ConcurrentHashMap mVirtualNodes = new ConcurrentHashMap<>(40); public RootRenderNode(int rootId, int id, int rendererId, @NonNull String className, @NonNull ControllerManager controllerManager) { @@ -68,7 +69,7 @@ public void addVirtualNode(@NonNull VirtualNode node) { } public void removeVirtualNode(int id) { - mVirtualNodes.delete(id); + mVirtualNodes.remove(id); } @Override From 6de4d6edb52c55bdd5b83ec17569b6806c1ee8ad Mon Sep 17 00:00:00 2001 From: maxli Date: Mon, 12 Aug 2024 14:33:15 +0800 Subject: [PATCH 2/2] fix(android): add ControllerRegistry destroy --- .../com/tencent/mtt/hippy/uimanager/ControllerManager.java | 4 ++-- .../com/tencent/mtt/hippy/uimanager/ControllerRegistry.java | 6 +++++- .../tencent/mtt/hippy/uimanager/ControllerUpdateManger.java | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerManager.java b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerManager.java index b0c676e4da5..7f42e845def 100644 --- a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerManager.java +++ b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerManager.java @@ -178,8 +178,8 @@ public HippyCustomPropsController getCustomPropsController() { } public void destroy() { - mControllerRegistry.clear(); - mControllerUpdateManger.clear(); + mControllerRegistry.destroy(); + mControllerUpdateManger.destroy(); for (Pool pool : mPreCreateViewPools.values()) { pool.clear(); } diff --git a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerRegistry.java b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerRegistry.java index 0c49a43df16..09953cd0573 100644 --- a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerRegistry.java +++ b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerRegistry.java @@ -49,7 +49,11 @@ public ControllerRegistry(@NonNull Renderer renderer) { mRendererWeakRef = new WeakReference<>(renderer); } - public void clear() {} + void destroy() { + mViews.clear(); + mRootViews.clear(); + mControllers.clear(); + } public void addControllerHolder(String name, ControllerHolder controllerHolder) { mControllers.put(name, controllerHolder); diff --git a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerUpdateManger.java b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerUpdateManger.java index 8e228392c0f..8631ba0c494 100644 --- a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerUpdateManger.java +++ b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerUpdateManger.java @@ -83,7 +83,7 @@ public ControllerUpdateManger(@NonNull Renderer renderer) { mRendererWeakRef = new WeakReference<>(renderer); } - public void clear() { + void destroy() { }