Я создаю систему «сеансов», где пользователь может запускать, завершать и просматривать свой сеанс.
Пользователь проходит первый фрагмент, чтобы создать свою сессию, а затем входит во фрагмент "в сессии".
Если он вернется в главное меню до завершения сеанса, я хочу, чтобы он сразу перешел к «в сеансе», не просматривая фрагмент «нового сеанса».
Все данные сеанса хранятся в локальной базе данных, и я использую сопрограммы Kotlin для извлечения данных из БД (см. Пример кода ниже)
Я впервые использую сопрограмму, и я признаю, что это немного нечетко
для меня вся помощь приветствуется
Проблема в в том, что когда пользователь нажимает кнопку для навигации, сопрограмма завершает после проверки, чтобы увидеть, существует ли текущий сеанс, который приводит к проверке нулевого объекта или предыдущий сеанс текущего сеанса и, таким образом, перейдите к фрагменту «новый сеанс»
Мне нужен способ дождаться окончания сопрограммы, а затем
обрабатывать нажатие кнопки
Весь код, написанный здесь, содержится внутри модели представления .
Вот так я настраиваю Задание / Область
private var viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
И вот как я запускаю сопрограмму:
private fun initializeLastSession() {
uiScope.launch {
lastSession.value = getLastSessionFromDatabase()
}
}
private suspend fun getLastSessionFromDatabase(): Session? {
return withContext(Dispatchers.IO) {
var session = database.getLastSession()
session
}
}
Проверка выполняется внутри этой функции
fun isSessionActive(): Boolean {
//Simplified
if (lastSession.value = null) {
return false
} else if (...) {
return true
} else {
return false
}
Эта последняя функция isSessionActive вызывается из оператора if из фрагмента itlsef, когда пользователь нажимает кнопку навигации.
Если это правда, тогда перейдите к «InSession», иначе в «newSession»
Я видел несколько способов ожидания завершения сопрограммы, но ни один из них не соответствовал тому, как я его запускаю, и еще меньше есть решение, которое сработало для меня.