From 7af075633ba22a6e2951a6a0dac0588df071be6a Mon Sep 17 00:00:00 2001 From: arkon Date: Mon, 3 Feb 2020 19:11:18 -0500 Subject: [PATCH] Explicitly switch between IO/UI dispatchers when updating list of extensions Potentially fixes #2566 --- .../eu/kanade/tachiyomi/extension/ExtensionManager.kt | 10 ++++++++-- .../kanade/tachiyomi/util/lang/CoroutinesExtensions.kt | 3 +++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt index 5daad41f96..12310e9744 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt @@ -12,7 +12,9 @@ import eu.kanade.tachiyomi.extension.util.ExtensionInstallReceiver import eu.kanade.tachiyomi.extension.util.ExtensionInstaller import eu.kanade.tachiyomi.extension.util.ExtensionLoader import eu.kanade.tachiyomi.source.SourceManager +import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.launchNow +import eu.kanade.tachiyomi.util.lang.launchUI import kotlinx.coroutines.async import rx.Observable import uy.kohesive.injekt.Injekt @@ -144,12 +146,16 @@ class ExtensionManager( * Finds the available extensions in the [api] and updates [availableExtensions]. */ fun findAvailableExtensions() { - launchNow { - availableExtensions = try { + launchIO { + val extensions: List = try { api.findExtensions() } catch (e: Exception) { emptyList() } + + launchUI { + availableExtensions = extensions + } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/lang/CoroutinesExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/lang/CoroutinesExtensions.kt index 0965275485..c78fbfa590 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/lang/CoroutinesExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/lang/CoroutinesExtensions.kt @@ -5,6 +5,9 @@ import kotlinx.coroutines.* fun launchUI(block: suspend CoroutineScope.() -> Unit): Job = GlobalScope.launch(Dispatchers.Main, CoroutineStart.DEFAULT, block) +fun launchIO(block: suspend CoroutineScope.() -> Unit): Job = + GlobalScope.launch(Dispatchers.IO, CoroutineStart.DEFAULT, block) + @UseExperimental(ExperimentalCoroutinesApi::class) fun launchNow(block: suspend CoroutineScope.() -> Unit): Job = GlobalScope.launch(Dispatchers.Main, CoroutineStart.UNDISPATCHED, block)