AUSER :
나는 몇 가지 작업을 수행하고 비동기 적으로 결과를 반환하는 방법을 포함하고 내가 통제 할 수없는 API를 .... 있습니다. 내 응용 프로그램의 일부에 기적이 메소드를 호출하고 싶습니다. I 클래스 추가하여이 작업을 수행 한 ResultHandler
캡처 반환 결과를. 나는 아래에 그것을 한 적이 방식보다이 일을 더 좋은 방법이 있나요? 아마도 표준 코 틀린를 사용하여 (또는 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()
}
}
AUSER :
the_dani에서 힌트 덕분에
내가 "에 설명 된대로 코 루틴을 사용하여 아래의 솔루션에 와서 관리되는 포장 콜백 "는 코 틀린의 부분은 문서를 코 루틴 :
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) }
}
}