【问题标题】:Suspend execution until object value is set through LiveData暂停执行,直到通过 LiveData 设置对象值
【发布时间】:2020-09-18 21:23:00
【问题描述】:

我正在使用第三方 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 不为空,然后继续执行其余的操作。如何使用 Kotlin Coroutines 实现这一目标?

【问题讨论】:

  • 这里为什么需要使用协程?为什么不在观察者回调中创建对象后立即调用doSomething?实际上,为了等待对象不为空,库必须返回一个Deferred 对象。

标签: android kotlin android-livedata kotlin-coroutines


【解决方案1】:

如果你想等待结果,你的函数必须是可挂起的。使用suspendCoroutine 获取延续并从回调中恢复:

suspend fun setValueAndDoSomething(activity: FragmentActivity) {
    val myCustomObject = suspendCoroutine<MyCustomObject> { cont ->
        sdkComponent.observe(activity, Observer { sdkResult ->
            cont.resume(MyCustomObject(sdkResult))
        })
    }
    myCustomObject.doSomething()
}

为了能够调用它,你必须 launch 一个协程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多