Skip to content

Commit 79758b6

Browse files
authored
Merge pull request #2281 from OneSignal/anr-model-add
Fix: ANR caused by model.add(), model.initializeFromJson(), or modelstore.load()
2 parents e311bf1 + 2d71e76 commit 79758b6

File tree

3 files changed

+21
-21
lines changed

3 files changed

+21
-21
lines changed

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/operations/impl/OperationRepo.kt

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

3+
import com.onesignal.common.threading.OSPrimaryCoroutineScope
34
import com.onesignal.common.threading.WaiterWithValue
45
import com.onesignal.core.internal.config.ConfigModelStore
56
import com.onesignal.core.internal.operations.ExecutionResult
@@ -102,14 +103,23 @@ internal class OperationRepo(
102103
}
103104
}
104105

106+
/**
107+
* Enqueuing will be performed in a designate coroutine and may not be added instantly.
108+
* This is to prevent direct enqueuing from the main thread that may cause a deadlock if loading
109+
* is still in process.
110+
*
111+
* If the enqueuing needs to be suspended, use enqueueAndWait() instead.
112+
*/
105113
override fun enqueue(
106114
operation: Operation,
107115
flush: Boolean,
108116
) {
109117
Logging.log(LogLevel.DEBUG, "OperationRepo.enqueue(operation: $operation, flush: $flush)")
110118

111119
operation.id = UUID.randomUUID().toString()
112-
internalEnqueue(OperationQueueItem(operation, bucket = enqueueIntoBucket), flush, true)
120+
OSPrimaryCoroutineScope.execute {
121+
internalEnqueue(OperationQueueItem(operation, bucket = enqueueIntoBucket), flush, true)
122+
}
113123
}
114124

115125
override suspend fun enqueueAndWait(

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

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

3-
import com.onesignal.common.threading.OSPrimaryCoroutineScope
43
import com.onesignal.common.threading.suspendifyOnThread
54
import com.onesignal.core.internal.config.ConfigModelStore
65
import com.onesignal.core.internal.operations.IOperationRepo
@@ -41,10 +40,7 @@ internal class SessionListener(
4140
}
4241

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

5046
override fun onSessionActive() {
@@ -58,12 +54,9 @@ internal class SessionListener(
5854
Logging.error("SessionListener.onSessionEnded sending duration of $durationInSeconds seconds")
5955
}
6056

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

6861
suspendifyOnThread {
6962
_outcomeEventsController.sendSessionEndOutcomeEvent(durationInSeconds)

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

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

33
import com.onesignal.common.IDManager
4-
import com.onesignal.common.threading.OSPrimaryCoroutineScope
54
import com.onesignal.core.internal.application.IApplicationService
65
import com.onesignal.core.internal.config.ConfigModelStore
76
import com.onesignal.core.internal.operations.IOperationRepo
@@ -29,14 +28,12 @@ class UserRefreshService(
2928
return
3029
}
3130

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

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

0 commit comments

Comments
 (0)