Skip to content

Commit 0de1885

Browse files
committed
fix: ANR caused by operationRepo.enqueue while loading is not complete
Making the enqueue logic to be done in the background
1 parent fc48c72 commit 0de1885

File tree

3 files changed

+39
-10
lines changed

3 files changed

+39
-10
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.onesignal.common.threading
2+
3+
import kotlinx.coroutines.CoroutineScope
4+
import kotlinx.coroutines.launch
5+
import kotlinx.coroutines.newSingleThreadContext
6+
7+
object OSPrimaryCoroutineScope {
8+
// CoroutineScope tied to the main thread
9+
private val mainScope = CoroutineScope(newSingleThreadContext(name = "OSPrimaryCoroutineScope"))
10+
11+
/**
12+
* Executes the given [block] on the OS primary coroutine scope.
13+
*/
14+
fun execute(block: suspend () -> Unit) {
15+
mainScope.launch {
16+
block()
17+
}
18+
}
19+
}

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/session/internal/session/impl/SessionListener.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.onesignal.session.internal.session.impl
22

3+
import com.onesignal.common.threading.OSPrimaryCoroutineScope
34
import com.onesignal.common.threading.suspendifyOnThread
45
import com.onesignal.core.internal.config.ConfigModelStore
56
import com.onesignal.core.internal.operations.IOperationRepo
@@ -40,7 +41,10 @@ internal class SessionListener(
4041
}
4142

4243
override fun onSessionStarted() {
43-
_operationRepo.enqueue(TrackSessionStartOperation(_configModelStore.model.appId, _identityModelStore.model.onesignalId), true)
44+
// enqueue the operation in background
45+
OSPrimaryCoroutineScope.execute {
46+
_operationRepo.enqueue(TrackSessionStartOperation(_configModelStore.model.appId, _identityModelStore.model.onesignalId), true)
47+
}
4448
}
4549

4650
override fun onSessionActive() {
@@ -54,9 +58,12 @@ internal class SessionListener(
5458
Logging.error("SessionListener.onSessionEnded sending duration of $durationInSeconds seconds")
5559
}
5660

57-
_operationRepo.enqueue(
58-
TrackSessionEndOperation(_configModelStore.model.appId, _identityModelStore.model.onesignalId, durationInSeconds),
59-
)
61+
// enqueue the operation in background
62+
OSPrimaryCoroutineScope.execute {
63+
_operationRepo.enqueue(
64+
TrackSessionEndOperation(_configModelStore.model.appId, _identityModelStore.model.onesignalId, durationInSeconds),
65+
)
66+
}
6067

6168
suspendifyOnThread {
6269
_outcomeEventsController.sendSessionEndOutcomeEvent(durationInSeconds)

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/service/UserRefreshService.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.onesignal.user.internal.service
22

33
import com.onesignal.common.IDManager
4+
import com.onesignal.common.threading.OSPrimaryCoroutineScope
45
import com.onesignal.core.internal.application.IApplicationService
56
import com.onesignal.core.internal.config.ConfigModelStore
67
import com.onesignal.core.internal.operations.IOperationRepo
@@ -28,12 +29,14 @@ class UserRefreshService(
2829
return
2930
}
3031

31-
_operationRepo.enqueue(
32-
RefreshUserOperation(
33-
_configModelStore.model.appId,
34-
_identityModelStore.model.onesignalId,
35-
),
36-
)
32+
OSPrimaryCoroutineScope.execute {
33+
_operationRepo.enqueue(
34+
RefreshUserOperation(
35+
_configModelStore.model.appId,
36+
_identityModelStore.model.onesignalId,
37+
),
38+
)
39+
}
3740
}
3841

3942
override fun start() = _sessionService.subscribe(this)

0 commit comments

Comments
 (0)