From 5d254d3588810e9c7c7304145cdb3492491ca0e0 Mon Sep 17 00:00:00 2001 From: Jason Toms Date: Wed, 19 Nov 2025 12:18:25 +0100 Subject: [PATCH] fix: ensure lifecycle observer added on main thread Unleash startup could crash if start was triggered on a background thread --- .../java/io/getunleash/android/DefaultUnleash.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/unleashandroidsdk/src/main/java/io/getunleash/android/DefaultUnleash.kt b/unleashandroidsdk/src/main/java/io/getunleash/android/DefaultUnleash.kt index 8cfb128..d6ce882 100644 --- a/unleashandroidsdk/src/main/java/io/getunleash/android/DefaultUnleash.kt +++ b/unleashandroidsdk/src/main/java/io/getunleash/android/DefaultUnleash.kt @@ -50,8 +50,8 @@ import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import kotlinx.coroutines.withTimeout import java.io.File -import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.TimeoutException import java.util.concurrent.atomic.AtomicBoolean @@ -126,10 +126,10 @@ class DefaultUnleash( ) else NoOpMetrics() fetcher = UnleashFetcher( - unleashConfig, - httpClientBuilder.build("poller", unleashConfig.pollingStrategy), - unleashContextState.asStateFlow() - ) + unleashConfig = unleashConfig, + httpClient = httpClientBuilder.build("poller", unleashConfig.pollingStrategy), + unleashContext = unleashContextState.asStateFlow() + ) taskManager = LifecycleAwareTaskManager( dataJobs = buildDataJobs(metrics, fetcher), networkAvailable = networkStatusHelper.isAvailable(), @@ -168,7 +168,9 @@ class DefaultUnleash( readyOnFeaturesReceived() } cache.subscribeTo(fetcher.getFeaturesReceivedFlow()) - lifecycle.addObserver(taskManager) + coroutineScope.launch(Dispatchers.Main) { + lifecycle.addObserver(taskManager) + } if (bootstrapFile != null && bootstrapFile.exists()) { UnleashLogger.i(TAG, "Using provided bootstrap file") Parser.proxyResponseAdapter.fromJson(bootstrapFile.readText())?.let { state ->