From 8a7709cd4739769ce08c68ba8b2386a12351578d Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 25 Mar 2025 11:17:57 +0100 Subject: [PATCH] Delay heavy tasks to prevent ServiceDidNotStartInTimeException (for example) --- .../java/org/linphone/contacts/ContactLoader.kt | 8 ++++---- .../main/java/org/linphone/core/CoreContext.kt | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/linphone/contacts/ContactLoader.kt b/app/src/main/java/org/linphone/contacts/ContactLoader.kt index 7cdff06a2..211403a59 100644 --- a/app/src/main/java/org/linphone/contacts/ContactLoader.kt +++ b/app/src/main/java/org/linphone/contacts/ContactLoader.kt @@ -107,9 +107,9 @@ class ContactLoader : LoaderManager.LoaderCallbacks { } Log.i("$TAG Load finished, found ${cursor.count} entries in cursor") - coreContext.postOnCoreThread { + coreContext.postOnCoreThreadWhenAvailableForHeavyTask({ parseFriends(cursor) - } + }, "parse friends") } @MainThread @@ -265,9 +265,9 @@ class ContactLoader : LoaderManager.LoaderCallbacks { Log.i("$TAG Contacts parsed, posting another task to handle adding them (or not)") // Re-post another task to allow other tasks on Core thread - coreContext.postOnCoreThread { + coreContext.postOnCoreThreadWhenAvailableForHeavyTask({ addFriendsIfNeeded() - } + }, "add friends to Core") } catch (sde: StaleDataException) { Log.e("$TAG State Data Exception: $sde") } catch (ise: IllegalStateException) { diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index c50e81b9f..1cd2500b8 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -38,6 +38,7 @@ import androidx.lifecycle.MutableLiveData import com.google.firebase.crashlytics.FirebaseCrashlytics import kotlin.system.exitProcess import org.linphone.BuildConfig +import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.contacts.ContactsManager import org.linphone.core.tools.Log @@ -653,6 +654,21 @@ class CoreContext } } + @AnyThread + fun postOnCoreThreadWhenAvailableForHeavyTask(@WorkerThread lambda: (core: Core) -> Unit, name: String) { + postOnCoreThread { + if (core.callsNb >= 1) { + Log.i("$TAG At least one call is active, wait until there is no more call before executing lambda [$name] (checking again in 1 sec)") + coreContext.postOnCoreThreadDelayed({ + postOnCoreThreadWhenAvailableForHeavyTask(lambda, name) + }, 1000) + } else { + Log.i("$TAG No active call at the moment, executing lambda [$name] right now") + lambda.invoke(core) + } + } + } + @AnyThread fun postOnMainThread( @UiThread lambda: () -> Unit