Tristan
02/13/2022, 11:37 PMclass UserRepository(
private val userDataSource: UserDataSource,
private val coroutineScope: CoroutineScope = CoroutineScope(Dispatchers.Default)
) {
private val userMutex = Mutex()
private var user: User? = null
suspend fun fetch(userId: String): User? {
println("Fetch user")
println("context = " + coroutineContext) // prints Main
if (user === null) {
val result = withContext(coroutineScope.coroutineContext) {
println("Switch context")
println("context = " + kotlin.coroutines.coroutineContext) // prints Dispatched
adsSdkConfigurationDataSource.getUser(userId)
}
publisherConfigurationMutex.withLock {
println("Mutation")
println("context = " + coroutineContext) // prints Main
publisherConfigurationApiModel = result
}
}
return publisherConfigurationMutex.withLock {
publisherConfigurationApiModel
}
}
}
My logs look like
Instantiate UserRepository
context = [StandaloneCoroutine{Active}@2272df8, MainDispatcher]
Is UserRepository frozen? false
Fetch user
context = [StandaloneCoroutine{Active}@2272df8, MainDispatcher]
Switch context
context = [DispatchedCoroutine{Active}@3921848, WorkerCoroutineDispatcherImpl@2225538]
Mutation
context = [StandaloneCoroutine{Active}@2272df8, MainDispatcher]
Uncaught Kotlin exception: kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen com.me.UserRepository@227a228
Why after coming back to the context that created the UserRepository
I cannot perform a mutation?Nick Allen
02/14/2022, 3:11 AMJoffrey
02/14/2022, 8:35 AMTristan
02/14/2022, 3:43 PM