gpt4 book ai didi

java - 在 Kotlin 中使异步调用同步

转载 作者:行者123 更新时间:2023-12-02 12:47:48 24 4
gpt4 key购买 nike

我有一个我无法控制的 API....其中包含一个执行某些工作并异步返回结果的方法。我想在我的应用程序的某些部分同步调用此方法。我通过添加一个类 ResultHandler 来捕获并返回结果来完成此操作。有没有比我下面的方法更好的方法?也许使用标准 kotlin(或 Java 作为最后的手段)库方法。我的偏好是让 awaitReply 返回结果并删除 CountdownLatch

class Main {
companion object {
@JvmStatic

fun main(args: Array<String>) {
val result1 = Main().nonAsyncMethod1(arrayListOf(1, 2, 3, 4, 5))
result1.elements.forEach { println(it) }
}
}

class Result1(var elements: Collection<String>)

fun asyncMethod1(x: Collection<Int>, callback: (Result1) -> Unit) {
Thread().run {
// do some calculation
Thread.sleep(1000)
callback(Result1(x.map { "\"$it\"" }.toList()))
}
}

private fun nonAsyncMethod1(entities: Collection<Int>): Result1 {
val resultHandler = ResultHandler<Result1>()

awaitReply<Result1> {
asyncMethod1(entities, resultHandler)
}
return resultHandler.getResponse()
}

open class ResultHandler<T : Any> : (T) -> Unit {
private lateinit var response: T
private val latch = CountDownLatch(1)

override fun invoke(response: T) {
latch.countDown()
this.response = response
}

fun getResponse(): T {
latch.await()
return response
}
}

private fun <T : Any> awaitReply(call: () -> Unit) {
return call.invoke()
}
}

最佳答案

感谢the_dani的提示

我设法使用协程找到了下面的解决方案,如 Kotlin 协程文档的“Wrapping callbacks”部分所述:

class Main {
companion object {
@JvmStatic

fun main(args: Array<String>) = runBlocking {
val result1 = Main().nonAsyncMethod1(arrayListOf(1, 2, 3, 4, 5))
result1.elements.forEach { println(it) }
}
}

class Result1(var elements: Collection<String>)

fun asyncMethod1(x: Collection<Int>, callback: (Result1) -> Unit) {
Thread().run {
// do some calculation
Thread.sleep(1000)
callback(Result1(x.map { "\"$it\"" }.toList()))
}
}

suspend fun nonAsyncMethod1(entities: Collection<Int>): Result1 = suspendCoroutine {
cont ->
asyncMethod1(entities) { cont.resume(it) }
}
}

关于java - 在 Kotlin 中使异步调用同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53765396/

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