지난 callbackFlow에 이어서 callback를 coroutine 형태로 받을 수 있는 suspendCoroutine과 suspendCancellableCoroutine에 대해 알아보려고 합니다. 1. suspendCoroutine public suspend inline fun suspendCoroutine( crossinline block: (Continuation) -> Unit): T { } 먼저 suspendCoroutine에 대해 알아보도록 하겠습니다. 내부 코드와 함께 적힌 설명을 살펴보면, block 람다 함수는 Continuation 객체를 인자로 받으며, 비동기 작업이 완료되면 결과를 이 Continutaion 객체를 통해 반환합니다. Continuation 객체는 현재 코루틴 상..
라이브러리나 sdk에서 callback 형태로 받는 API를 Flow로 받고 싶을 땐 어떻게 해야 할까요?! callbackFlow, suspencoroutine 등을 이용하여 Flow로 받을 수 있습니다. 이번에는 callbackFlow에 대해 공부해보려고 합니다. 1. callbackFlow란 public fun callbackFlow(@BuilderInference block: suspend ProducerScope.() -> Unit) : Flow = CallbackFlowBuilder(block) callbackFlow는 callback을 Flow로 변환할 수 있는 Flow Builder입니다. 공식 문서에 따르면, ProducerScope를 통해 빌더 블록의 코드에 전달된 SendChannel..
Flow는 스스로 라이프사이클을 알지 못하기 때문에 CoroutineScope에 따라 생명주기에 따라 맞추어 사용하며 불필요한 메모리나 리소스가 낭비되지 않도록 하는 것이 중요합니다! 이번에는 LifecycleOwner.launchWhenStarted, Lifecycle.repeatOnLifecycle 등이 어떻게 다른지 알아보고 어떻게 불필요한 리소스 낭비를 방지해야 할지 알아보려고 합니다. lifecycleScope.launch private val _stateFlow = MutableStateFlow(0) val stateFlow get() = _stateFlow private fun testCount() { viewModelScope.launch(Dispatchers.IO) { repeat(10)..
최근 MVI를 공부하면서 여러 예제 프로젝트를 보면서 공부하던 중 Channel을 이용하여 상태값을 주고 받는 것을 알게 되었습니다. 이참에 Channel에 대해서도 알아보고자 합니다! 1. Channel 이란 Channel은 두개의 Coroutine 사이를 연결한 파이프이며, 단방향보다는 여러 방향에서 데이터를 주고 받는 형식으로 코루틴끼리 데이터를 전달하기 위한 것입니다. Channel은 BlockingQueue와 유사하지만, 약간의 차이점이 존재합니다. BlockingQueue은 put(), take()를 사용하여 차단해서 전송하는 방법이고 Channel은 send(), receive()를 사용하여 일시중단(suspend)으로 전송하는 방식입니다. 또한, Channel은 더 이상 사용하지 않을 때 ..
Dispatcher에 Coroutine을 붙이는 작업을 하기 위해서는 async와 launch 두 가지 메소드를 이용할 수 있습니다. 그렇다면 launch와 async에 차이점과 언제 사용해야하는지 알아보려고 합니다! launch란 launch를 통해 코루틴 블록을 만드는 것을 코루틴 빌더 생성이라고 하며, launch는 현재 스레드를 차단하지 않고 새로운 코루틴을 실행할 수 있으며 특정 결과값 없이 Job 객체를 반환합니다. fun main() { val job = GlobalScope.launch { delay(1000L) println("coroutine launch") } println("call in main") println("job is Active: ${job.isActive}, Compl..