diff --git a/core-render-android/src/main/java/com/tencent/kuikly/core/render/android/expand/component/KRImageView.kt b/core-render-android/src/main/java/com/tencent/kuikly/core/render/android/expand/component/KRImageView.kt index 2defee5eb6..72df5d9c99 100644 --- a/core-render-android/src/main/java/com/tencent/kuikly/core/render/android/expand/component/KRImageView.kt +++ b/core-render-android/src/main/java/com/tencent/kuikly/core/render/android/expand/component/KRImageView.kt @@ -646,18 +646,28 @@ class KRWrapperImageView(context: Context) : KRView(context) { override fun resetProp(propKey: String): Boolean { var result = super.resetProp(propKey) - result = imageView.resetProp(propKey) + if (!result) { + result = imageView.resetProp(propKey) + } if (propKey == PROP_PLACEHOLDER) { - removePlaceholder() + setPlaceholder("") result = true } return result } + override fun onDestroy() { + super.onDestroy() + placeholderView?.onDestroy() + placeholderView = null + imageView.onDestroy() + } + private fun setPlaceholder(src: String) { if (placeholder != src) { placeholder = src placeholderView?.removeFromParent() + placeholderView?.onDestroy() if (placeholder.isNotEmpty()) { placeholderView = KRImageView(context).apply { val lp = LayoutParams(this@KRWrapperImageView.frameWidth, @@ -668,17 +678,11 @@ class KRWrapperImageView(context: Context) : KRView(context) { this@KRWrapperImageView.addView(this, 0) } } else { - removePlaceholder() + placeholderView = null } } } - private fun removePlaceholder() { - placeholderView?.removeFromParent() - placeholderView = null - placeholder = "" - } - companion object { private const val PROP_PLACEHOLDER = "placeholder" const val VIEW_NAME = "KRWrapperImageView" diff --git a/core-render-android/src/main/java/com/tencent/kuikly/core/render/android/layer/KuiklyRenderLayerHandler.kt b/core-render-android/src/main/java/com/tencent/kuikly/core/render/android/layer/KuiklyRenderLayerHandler.kt index fcb63a7999..8ded06ddaa 100644 --- a/core-render-android/src/main/java/com/tencent/kuikly/core/render/android/layer/KuiklyRenderLayerHandler.kt +++ b/core-render-android/src/main/java/com/tencent/kuikly/core/render/android/layer/KuiklyRenderLayerHandler.kt @@ -75,6 +75,8 @@ class KuiklyRenderLayerHandler : IKuiklyRenderLayerHandler { */ private val renderViewReuseListMap = ArrayMap>() + private var isDestroyed = false + override fun init(renderView: IKuiklyRenderView) { renderViewWeakRef = WeakReference(renderView) } @@ -255,6 +257,10 @@ class KuiklyRenderLayerHandler : IKuiklyRenderLayerHandler { override fun getView(tag: Int): View? = getRenderViewHandler(tag)?.viewExport?.view() override fun onDestroy() { + assert(isMainThread()) { + "must call on ui thread" + } + moduleRegistryWRLock.withReadLock { for (module in moduleRegistry.values) { module.onDestroy() @@ -264,7 +270,19 @@ class KuiklyRenderLayerHandler : IKuiklyRenderLayerHandler { for (i in 0 until renderViewRegistry.size()) { renderViewRegistry.valueAt(i).viewExport.onDestroy() } + renderViewRegistry.clear() + + for (i in 0 until renderViewReuseListMap.size) { + val queue = renderViewReuseListMap.valueAt(i) + for (j in 0 until queue.size) { + queue[j].viewExport.onDestroy() + } + queue.clear() + } + + isDestroyed = true } + private fun getRenderViewHandler(tag: Int): RenderViewHandler? { assert(isMainThread()) { "must call on ui thread" @@ -318,12 +336,12 @@ class KuiklyRenderLayerHandler : IKuiklyRenderLayerHandler { private fun pushRenderViewHandlerToReuseQueue( viewName: String, renderViewHandler: RenderViewHandler - ) { + ): Boolean { assert(isMainThread()) { "must call on ui thread" } if (!renderViewHandler.viewExport.reusable) { - return + return false } var reuseQueue = renderViewReuseListMap[viewName] if (reuseQueue == null) { @@ -331,23 +349,25 @@ class KuiklyRenderLayerHandler : IKuiklyRenderLayerHandler { renderViewReuseListMap[viewName] = reuseQueue } if (reuseQueue.size >= MAX_REUSE_COUNT) { - return + return false } prepareForReuse(renderViewHandler.viewExport) // 重置View的样式,防止复用的时候样式错乱 reuseQueue.add(renderViewHandler) + return true } private fun innerRemoveRenderView(tag: Int) { val renderViewHandler = getRenderViewHandler(tag) - assert(renderViewHandler != null) + assert(renderViewHandler != null || isDestroyed) - renderViewHandler?.viewExport?.also { - pushRenderViewHandlerToReuseQueue(renderViewHandler.viewName, renderViewHandler) - it.removeFromParent() - it.onDestroy() + renderViewHandler?.also { + it.viewExport.removeFromParent() + if (!pushRenderViewHandlerToReuseQueue(it.viewName, it)) { + it.viewExport.onDestroy() + } + removeRenderViewHandler(tag) } - removeRenderViewHandler(tag) } private fun getShadowHandler(tag: Int): IKuiklyRenderShadowExport? {