Ответ
Для синхронного взаимодействия чаще всего использовал Kotlin Coroutines с Flow или LiveData для UI-слоя. В сочетании с Retrofit и suspend-функциями для сетевых запросов.
Пример:
viewModelScope.launch {
try {
val data = repository.fetchData() // suspend-функция
_uiState.value = UiState.Success(data)
} catch (e: Exception) {
_uiState.value = UiState.Error(e.message)
}
}
Для межпоточного взаимодействия — Mutex или Channel в корутинах. В редких случаях — synchronized или BlockingQueue, если требовалась интеграция с Java-кодом.