gpt4 book ai didi

android - 在 Kotlin 中将回调转换为可挂起的协程

转载 作者:行者123 更新时间:2023-12-04 23:59:16 28 4
gpt4 key购买 nike

我目前有一个回调,它不是同步返回一个值,而是需要做一些异步工作然后返回结果。我一直在研究如何去做,但我不清楚。到目前为止我所取得的成就是这样的,但是由于我需要将返回放入 foo 方法中,首先它返回“something”然后返回调用 someMethod() 的结果。

我假装的有可能吗?

  class CustomClass() :
SomeClass.SomeInterface {

override fun foo(p0: SomeType): String {
val result = "something"
MainScope().launch {
withContext(Dispatchers.IO) {
result = someMethod()
}
}
return result
}

suspend fun someMethod(): String =
suspendCancellableCoroutine { cancelableContinuation ->
//TODO: register some listener that will end up calling
cancelableContinuation.resume("some_value", {})
}

提前致谢!

最佳答案

不能同步返回结果,所以foo必须定义为挂起函数。

此外,没有理由在 withContext 中包装暂停函数调用.暂停函数(如果组合正确)在内部包装任何阻塞代码,因此它们可以安全地从任何调度程序调用,因此没有理由使用 withContext 指定一个

如果你去掉 withContext以及您没有等待的协同程序的启动,foo()除了调用 someMethod 什么都不做,因此您只需将该代码从 someMethod 移走即可进入foo .但是foo必须定义为 suspend功能。

override suspend fun foo(p0: SomeType): String = suspendCancellableCoroutine { continuation ->
val request = someApi.request(p0) { result: String ->
continuation.resume(result)
}
continuation.invokeOnCancellation {
request.cancel()
}
}

通常,您不希望像这样的模型类从它们自己的 CoroutineScopes 启动协程。只需让它们公开暂停功能即可。由更高级别的类(如 Activity、Fragment 和 ViewModel)从其所需范围启动协程,以便它们可以控制协程生命周期。

关于android - 在 Kotlin 中将回调转换为可挂起的协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67632814/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com