Приостановить выполнение, пока значение объекта не будет установлено через LiveData

#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 сопрограмма.