Привет всем! Я использую Mutex для изменения стейта, вот так

private val mutex: Mutex = Mutex()

protected suspend fun setState(reducer: State.() -> State) {
mutex.withLock {
_state.value = state.value.reducer()
Log.d(
"SET_STATE", "${reducer.javaClass.name}\n" +
_state.value.toString()
)
}
}

Сейчас начали всплывать креши с такой вот ошибкой
kotlinx.coroutines.CompletionHandlerException: Exception in resume onCancellation handler for CancellableContinuation(DispatchedContinuation[AndroidUiDispatcher@20ca558, Continuation at androidx.compose.foundation.gestures.PressGestureScopeImpl.reset(TapGestureDetector.kt:357)@f59af17]){Completed}@f52bf04
...
Caused by: java.lang.IllegalStateException: Mutex is not locked

Что может быть?

6 ответов

3 просмотра

а какую задачу вы преследуете мьютексом на ui слое?

Roman-Bocharov Автор вопроса
Michael Orlov
а какую задачу вы преследуете мьютексом на ui слое...

Иногда падала ошибка при изменении стейта одновременно

А у вас Flow или LiveData?

Roman-Bocharov Автор вопроса

abstract class BaseViewModel<State, Event, Effect>(initialState: State) : ViewModel() { private val _state = mutableStateOf(initialState) val state: androidx.compose.runtime.State<State> get() = _state private val _effect: Channel<Effect> = Channel() val effect = _effect.receiveAsFlow() private val _event = MutableSharedFlow<Event>() init { viewModelScope.launch { _event.collect(::handleEvents) } } private val mutex: Mutex = Mutex() protected suspend fun setState(reducer: State.() -> State) { mutex.withLock { _state.value = state.value.reducer() Log.d( "SET_STATE", "${reducer.javaClass.name}\n" + _state.value.toString() ) } } fun setEvent(event: Event) { viewModelScope.launch { _event.emit(event) } } abstract fun handleEvents(event: Event) protected fun setEffect(builder: () -> Effect) { viewModelScope.launch { _effect.send(builder()) } } } Это базовая.

Roman Bocharov
abstract class BaseViewModel<State, Event, Effect>...

Может быть StateFlow использовать для state? Он из коробки потокобезопасный

Похожие вопросы

Обсуждают сегодня

Ребят, привет. Интересует вопрос: есть ли способ получить доступ к WebView в Linux? Рылся-ковырялся, решения не нашел. Объясню сразу задачу, возможно, скажете, что копаю не в...
advanc3d
13
Надо ли говорить, что нужно делать локальные зеркала всего что надо вам для работы, что бы не получилось, как с Docker одним прекрасным утром? 🌝 США запрещают предоставление ...
Alex Sherbakov
6
Что нового в Xcode 16 Xcode 16 приносит много обновлений. Главное - появление ИИ, которое отметили еще в кейноуте. В Xcode появится предиктивное завершение кода, основанное н...
✌️(´ヮ`)
1
Спасибо. Начну с клиент-сервер. Там разберусь И еще вопрос - можно ли как то джобы отправлять на определенные клиенты? Например есть vdi и linux машина. Можно ли задачу оправ...
Sergey Ivanov
4
А что насчет FluentValidation? тоже ведь есть альтернатива у МС.
devman
13
Всем привет. Я только начал изучать nomad и есть несколько вопросов. Я хочу развернуть 1 сервер и 1 клиент чтобы потыкаться и пощупать как работает это. А можно ли развернуть...
Sergey Ivanov
2
Я не понимаю зачем нужен новый тип Int128, который занимает столько же места сколько и uuid, те я как и раньше пользовался uuid, так и дальше буду пользоваться Как тут в чате...
Сергей Романенко
6
скажите честно, вы трезво работаете или присутствует допинг?
гλI3 🇺🇦 гΔφ 🐈 ябвдулавич
8
Привет! Есть замена https://octobercms.com/plugin/pikanji-agent под 3 версию? Или может его правил кто?
Денис Александрович
2
шоб работала ссылка t.me/bot/app?startapp=123 какой ритуал надо провести?
Shen
2
Карта сайта