#android #kotlin #android-livedata #kotlin-coroutines
#Android #kotlin #android-livedata #kotlin-сопрограммы
Вопрос:
Я работаю со сторонним SDK, в котором есть объект LiveData, который мне нужно наблюдать, чтобы установить значение моего пользовательского объекта:
fun setValueAndDoSomething(activity: FragmentActivity) {
var myCustomObject: MyCustomObject? = null
sdkComponent.observe(activity, Observer { sdkResult ->
myCustomObject = MyCustomObject(sdkResult)
})
// Wait until myCustomObject is not null
myCustomObject.doSomething()
}
Я хочу подождать, пока не будет запущен обратный вызов SDK LiveData, чтобы MyCustomObject не был равен null, чтобы продолжить выполнение. Как я могу добиться этого, используя сопрограммы Kotlin?
Комментарии:
1. Зачем вам нужно использовать сопрограмму здесь? Почему бы просто не вызвать
doSomething
сразу после создания объекта в обратном вызове наблюдателя? И на самом деле, чтобы дождаться, пока объект не станет not null, библиотека должна вернутьDeferred
объект.
Ответ №1:
Если вы хотите дождаться результата, ваша функция должна быть приостановлена. Используется suspendCoroutine
для получения продолжения и возобновления его из обратного вызова:
suspend fun setValueAndDoSomething(activity: FragmentActivity) {
val myCustomObject = suspendCoroutine<MyCustomObject> { cont ->
sdkComponent.observe(activity, Observer { sdkResult ->
cont.resume(MyCustomObject(sdkResult))
})
}
myCustomObject.doSomething()
}
Чтобы иметь возможность вызывать это, вам потребуется launch
сопрограмма.