본 내용은 학습을 위해 Callback to Coroutines in Kotlin 을 보고 정리한 글입니다.
Library.doSomething(object : Listener {
override fun onSuccess(result: Result) {
}
override fun onError(throwable: Throwable) {
}
})
suspend fun doSomething(): Result { // 1
return suspendCoroutine { continuation -> // 2
Library.doSomething(object : Listener {
override fun onSuccess(result: Result) {
continuation.resume(result) // 3
}
override fun onError(throwable: Throwable) {
continuation.resumeWithException(throwable) // 4
}
})
}
}
Result
를 리턴하는 suspend
추가suspendCoroutine
사용continuation.resume(result)
사용continuation.resumeWithException(throwable)
사용이와 같이 적용하면, 아래와 같이 호출이 가능함
launch {
val result = doSomething()
}
아래와 같은 함수로 "취소"를 하는 기능이 있다고 가정
Library.cancel(id)
적용해보면?
suspend fun doSomething(): Result {
return suspendCancellableCoroutine { continuation -> // 1
val id = Library.doSomething(object : Listener {
override fun onSuccess(result: Result) {
continuation.resume(result)
}
override fun onError(throwable: Throwable) {
continuation.resumeWithException(throwable)
}
})
continuation.invokeOnCancellation { // 2
Library.cancel(id)
}
}
}
suspendCancellableCoroutine
사용continuation.invokeOnCancellation
블록 내부에서 호출이와 같이 적용하면, 아래와 같이 호출이 가능함
launch {
val result = doSomething()
}