Следуя демонстрации codelab от Google ( ссылка ), я пытаюсь реорганизовать свой код в ViewModel + сопрограммы.У меня вопрос: вместо того, чтобы просто вставить данные ( исходный код ), я хочу дождаться результата от операции вставки, которая должна вернуть идентификатор, если вставка прошла успешно, затем сделать что-то на основе результата,Так как это сделать?
В настоящее время я отправляю метод в метод вставки ViewModel в качестве обратного вызова.Конечно, наблюдение за ViewModel является еще одним вариантом.Но есть ли лучшее решение?
Мой текущий код:
EventActivity:
viewModel.insert(Event("name"), {
if (it == -1L) {
Log.i("insert", "failure")
} else {
Log.i("insert", "success: $it")
}
})
EventViewModel:
private val mEventDao: EventDao = AppDatabase.getDatabase(application).eventDao()
private val mJob = Job()
private val mScope = CoroutineScope(Dispatchers.Main + mJob)
fun insert(event: Event, callback: (id: Long) -> Unit) {
mScope.launch(Dispatchers.IO) {
val result =
try {
// just for testing delay situation
delay(5000)
val id = mEventDao.insertEvent(event)
id
} catch (e: Exception) {
-1L
}
withContext(Dispatchers.Main) {
callback(result)
}
}
}
EventDao:
@Dao
interface EventDao {
fun insertEvent(event: Event): Long
}