diff --git a/client/android/div/src/main/java/com/yandex/div/core/view2/Div2View.kt b/client/android/div/src/main/java/com/yandex/div/core/view2/Div2View.kt index 5863f5a28..dd908496f 100644 --- a/client/android/div/src/main/java/com/yandex/div/core/view2/Div2View.kt +++ b/client/android/div/src/main/java/com/yandex/div/core/view2/Div2View.kt @@ -87,6 +87,7 @@ import com.yandex.div.internal.core.VariableMutationHandler import com.yandex.div.internal.util.UiThreadHandler.Companion.executeOnMainThreadBlocking import com.yandex.div.internal.util.hasScrollableChildUnder import com.yandex.div.internal.util.immutableCopy +import com.yandex.div.internal.util.toMapSafe import com.yandex.div.internal.widget.FrameContainerLayout import com.yandex.div.internal.widget.menu.OverflowMenuSubscriber import com.yandex.div.json.expressions.ExpressionResolver @@ -636,7 +637,7 @@ class Div2View private constructor( fun trackChildrenVisibility(): Unit = bindingDispatcher.runWithinBindingContext { val visibilityActionTracker = div2Component.visibilityActionTracker val bindingsSnapshot = synchronized(viewToDivBindings) { - viewToDivBindings.toMap() + viewToDivBindings.toMapSafe() } bindingsSnapshot.forEach { (view, div) -> view.bindingContext?.expressionResolver?.let { @@ -652,7 +653,7 @@ class Div2View private constructor( private fun discardChildrenVisibility() { val visibilityActionTracker = div2Component.visibilityActionTracker val bindingsSnapshot = synchronized(viewToDivBindings) { - viewToDivBindings.toMap() + viewToDivBindings.toMapSafe() } bindingsSnapshot.forEach { (view, div) -> view.bindingContext?.expressionResolver?.let { diff --git a/client/android/utils/src/main/java/com/yandex/div/internal/util/Collections.kt b/client/android/utils/src/main/java/com/yandex/div/internal/util/Collections.kt index bec6bfbcf..9c0e7168f 100644 --- a/client/android/utils/src/main/java/com/yandex/div/internal/util/Collections.kt +++ b/client/android/utils/src/main/java/com/yandex/div/internal/util/Collections.kt @@ -3,6 +3,7 @@ package com.yandex.div.internal.util import androidx.collection.ArrayMap import com.yandex.div.core.annotations.InternalApi import java.util.Collections +import java.util.WeakHashMap @InternalApi public fun arrayMap(): MutableMap = ArrayMap() @@ -63,3 +64,20 @@ public inline fun List?.compareNullableWith(other: List?, comparator: return compareWith(other, comparator) } + +@InternalApi +public fun WeakHashMap.toMapSafe(): Map { + if (isEmpty()) { + return emptyMap() + } + + val result = mutableMapOf() + val iterator = entries.iterator() + try { + while (iterator.hasNext()) { + val entry = iterator.next() + result[entry.key] = entry.value + } + } catch (e: NoSuchElementException) { } + return result +}