From 89c74603643e6adbda69cf544d04c31ba1469ee9 Mon Sep 17 00:00:00 2001 From: Andrei Gorelov <2652045@gmail.com> Date: Tue, 24 Mar 2026 16:34:06 +0300 Subject: [PATCH 1/2] =?UTF-8?q?Fix=20ConcurrentModificationException=20in?= =?UTF-8?q?=20AlphaTabRenderSurface=20placeholders=20list=C2=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphaTab/platform/android/AlphaTabRenderSurface.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/kotlin/src/android/src/main/java/alphaTab/platform/android/AlphaTabRenderSurface.kt b/packages/kotlin/src/android/src/main/java/alphaTab/platform/android/AlphaTabRenderSurface.kt index a5e71229e..0ff15e381 100644 --- a/packages/kotlin/src/android/src/main/java/alphaTab/platform/android/AlphaTabRenderSurface.kt +++ b/packages/kotlin/src/android/src/main/java/alphaTab/platform/android/AlphaTabRenderSurface.kt @@ -12,6 +12,7 @@ import android.widget.ScrollView import java.io.Closeable import java.lang.RuntimeException import kotlin.contracts.ExperimentalContracts +import java.util.concurrent.CopyOnWriteArrayList @ExperimentalUnsignedTypes @ExperimentalContracts @@ -44,7 +45,7 @@ internal class RenderPlaceholder(public var result: RenderFinishedEventArgs) : C @ExperimentalContracts internal class AlphaTabRenderSurface(context: Context, attributeSet: AttributeSet) : View(context, attributeSet), View.OnScrollChangeListener { - private val _placeholders: ArrayList = arrayListOf() + private val _placeholders: CopyOnWriteArrayList = CopyOnWriteArrayList() private val _resultIdToIndex: ObjectDoubleMap = ObjectDoubleMap() private var _totalWidth: Int = 0 @@ -65,11 +66,10 @@ internal class AlphaTabRenderSurface(context: Context, attributeSet: AttributeSe public fun clearPlaceholders() { _resultIdToIndex.clear() - val placeholder = _placeholders - for (p in placeholder) { + for (p in _placeholders) { p.close(); } - placeholder.clear() + _placeholders.clear() } override fun onAttachedToWindow() { From 821427db837577b278af3589f09a96bc208a84d7 Mon Sep 17 00:00:00 2001 From: Andrei Gorelov <2652045@gmail.com> Date: Wed, 25 Mar 2026 20:12:38 +0300 Subject: [PATCH 2/2] Fix Android resize throttle to run on main thread (prevent BoundsLookup ConcurrentModificationException) --- .../src/android/src/main/java/alphaTab/EnvironmentPartials.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kotlin/src/android/src/main/java/alphaTab/EnvironmentPartials.kt b/packages/kotlin/src/android/src/main/java/alphaTab/EnvironmentPartials.kt index d3f534bcc..cc7fe85bf 100644 --- a/packages/kotlin/src/android/src/main/java/alphaTab/EnvironmentPartials.kt +++ b/packages/kotlin/src/android/src/main/java/alphaTab/EnvironmentPartials.kt @@ -39,7 +39,7 @@ internal class EnvironmentPartials { print("Screen Size: ${AndroidEnvironment.screenWidth}x${AndroidEnvironment.screenHeight}"); } - private val throttleScope = CoroutineScope(Dispatchers.Default) + private val throttleScope = CoroutineScope(Dispatchers.Main) internal fun throttle(toThrottle: () -> Unit, delay: Double): () -> Unit { var job: Job? = null return {