본문 바로가기
반응형

Android 개발/Coroutine , Flow, Channel15

StateFlow vs SharedFlow 를 비교해보자 #이벤트 핸들링 오늘은 StateFlow 와 SharedFlow 에 대해서 정리해 보도록 하겠습니다. 1. 기존 글 참조 만약 SharedFlow와 StateFlow 각각에 대한 기본적인 부분들에 대해서 정리하고 싶으시다면, 아래 글들을 참조하신 다음에 이 글을 읽으면 더욱 도움이 될 것 입니다. >> SharedFlow 에 대한 총정리 # Buffer Replay tryEmit Kotlin Coroutine >> mutableStateOf 와 MutableStateFlow 비교 총정리 # collectAsState 2. StateFlow 는 State 변화를 위한 API 2-1. StateFlow 는 이벤트핸들링을 위한 API가 아니다 아래는 Kotlin 이 아닌 Android의 공식문서인데요. 중요한 부분이 잘 설명.. 2023. 5. 6.
SharedFlow 에 대한 총정리 # Buffer Replay tryEmit Kotlin Coroutine 오늘은 Kotlin Coroutine의 SharedFlow 에 대해서 정리해 보도록 하겠습니다. 1. SharedFlow SharedFlow 는 이름에서 알 수 있듯이, Collector 가 여러개인 경우, Collector 들이 emit 된 값들을 동시에 consume 할 수 있도록, Share(공유)되는 Flow 의 API 입니다. fun main() = runBlocking { val sharedFlow = MutableSharedFlow(replay = 1) launch { for (i in 1..5) { sharedFlow.emit(i) println("Emitted: $i") } } launch { sharedFlow.collect { value -> println("Collector 1에서 .. 2023. 5. 4.
Flow 결합연산자 combine , zip , merge 비교 총정리 # Kotlin Coroutine 오늘은 Kotlin Coroutine의 Flow API 중, flow들을 결합해 주는 오퍼레이터인, combine과 zip 그리고 merge에 대해서 총정리해 보겠습니다. 1. combine Combine 은 2개 이상의 스트림 되는 flow 데이터들을, 합쳐서 하나의 flow로 흘려보내 주는 API입니다. 2개의 스트림을 합쳐주는 것은 알겠는데, 각각의 데이터들이 다른 시점에 나올 때는 어떻게 되는 것일까요? 아래 공식문서의 설명에 따르면, 둘 중 가장 최근에 방출되는 값이 있으면, 그 값을 기준으로 합쳐진 flow 를 방출해 줍니다. 단순히 2개의 flow를 합쳐준다고만 이해해서는 안 되고요. 2개의 flow 중 어느 하나에서 아이템이 방출되면, 최근 2개의 flow를 합쳐서 방출해 줍니다. 좀 더.. 2023. 5. 3.
onEach vs onStart 비교 정리 # Kotlin Coroutine Flow 오늘은 Kotlin Coroutine Flow의 onEach 와 onStart 에대해서 정리해 보도록 하겠습니다. 1. onEach flow 에서 아이템이 흘러나올 때 마다, 실행하도록 해야하는 코드가 있다면, 이 연산자를 사용하는 것이 좋습니다. upstream 즉 위의 flow 에서 흘러나오는 값을 그대로 전달해 주기 때문에, 흘러나가는 데이터에는 영향을 주지 않습니다. 코드를 보면서 이해해 보도록 하겠습니다. val flow = flowOf(1, 2, 3, 4, 5) flow .onEach { item -> println("Item emitted: $item") } .map { item -> item * 2 } .collect { result -> println("결과: $result") } 2023. 5. 3.
Coroutine suspend 동작에 관한 좋은 예와 잘못된 예 # 비동기 오늘은 Coroutine 은 기본적으로 비동기를 기본으로 합니다. 그렇기에 비동기 블록이 suspend 되어서 결과값을 받아서 실행해야 할 경우는, suspend 함수를 위치시킬 때 생각을 해야 합니다. 그렇지 않으면 예상치 못한 동작을 보게되는데요. 오늘은 suspend 함수를 이용해서 Coroutine을 잘 사용한 예와 잘못 사용한 예를 점검해 보겠습니다. 1. suspend 가 제대로 동작하지 않는 잘못된 케이스 우선은 코드를 보도록 하겠습니다. 아래에서 launch 블록바깥에 결과를 얻어서, print 하는 것이 의도인데요. 실제로 실행해 보면, result에 값이 담기기 전에 지나쳐 버립니다. suspend fun fetchData(): String { delay(2000) return "dat.. 2023. 4. 18.
flatMapLatest 이용해서 값이 들어오는 것을 기다리기 # Coroutine 오늘은 flapMapLatest 를 활용해서 특정한 값이 들어오는 것을 기다리다가, 값이 들어오면 특정 코드를 실행시키는 방법에 대해서 정리해 보겠습니다. 물론, Coroutine 의 supsend 함수를 이용하면 어려운 일은 아니지만, 만약, Global 한 변수에 들어오는 값에 대해서라면 조금 다른 접근이 필요하기 때문입니다. 1. FlatMapLatest 이 API는 Kotlin Coroutine 의 Flow API인데요. Flow에서 흘러나오는 데이터 스트림에서, 가장 최근의 값만 취하기 위해서 만들어 졌습니다. 새로운 값이 흘러나오면 기존 flow는 cancel 시켜버리도록 되어 있습니다. 2. 값이 들어오는 것 기다리기 구현 가장 최근 값이 들어오는 것을 기다릴 때도, flatmapLates.. 2023. 4. 18.
함수 실행 시간 측정 후 Delay 사용하기 오늘은 함수의 실행시간을 체크하여서, 특정시간을 지나지 않으면, 그 만큼 Delay를 시키는 코드를 정리해 보겠습니다. 이런 코드는 특히 Splash화면 진행중에 하기에 용이한데요. 예를 들어 Splash를 3초정도 보여주고 싶다면, 특정 코드를 실행시키고 3초에서 남은 시간을 측정한 후, 나머지 시간만큼 Delay를 부여해 준다음 화면을 보여주기만 하면 되겠지요. 1. 함수 실행시간 측정하기 함수의 실행시간 측정은 아래와 같이 할 수 있습니다. 먼저 deleteFiles()라는 함수를 실행하였고요. 바로 직전과 실행후의 시간을 측정합니다. 시간 측정은 system.currentTimeMillis 를 활용하였습니다. 아래와 같은 코드를 이용하면, 최대 시간인 maxTimeMillis로부터, 걸린 시간(e.. 2023. 4. 14.
MutableStateFlow 이용한 로딩 후 로딩 완료 기다리기 구현 방법 AdView처럼 라이브러리에 로딩을 시키고, 해당 로딩이 다 될 때까지 기다릴 때 어떻게 구현해야 하는지 정리해 보겠습니다. 1. Mode 설정 먼저 여러가지 모드를 설정하기 위해서 다음과 같이 Mode에 관한 sealed class를 하나 작성해 줍니다. 이것은 로딩에서 로드가 완료되었을 때를 알기 위해서 인데요. 광고라이브러리에서는 보통 콜백으로 로드가 다 되었을 때 호출되는 onAdLoaded 와 같은 함수를 제공해 주므로, 이러한 콜백함수에서 Mode를 Loaded로 해주고, 로딩을 시작할 때, Loading으로 모드를 설정해 주면 되겠지요. sealed class AdMode { object Loading : AdMode() object Loaded : AdMode() data class Err.. 2023. 4. 8.
StateFlow 정리 # Android Kotlin Coroutine getStateFlow StateIn 오늘은 Kotlin의 StateFlow 에 대해서 정리해 보도록 하겠습니다. StateFlow도 Flow API의 하나인데요. Flow에 대한 내용은 아래 글을 참조해 주세요. >> Kotlin Coroutine Flow 총정리 part3 # launchIn 1. StateFlow StateFlow는 업데이트가 가능한 데이터값을 가지는 State라는 것을 가지고, collector에게 emit(전파)하는 인터페이스입니다. SharedFlow를 상속받은 인터페이스 이기도 한데요. State를 가지고 있다가, 변경되면 emit을 해주는 역할을 하는 핫스트림이라고 생각하면 됩니다. 핫스트림과 콜드스트림에 대해서는 아래 글을 참조해 주세요. >> Kotlin Coroutine Flow 총정리 part3 # la.. 2022. 10. 12.
Kotlin Coroutine Flow 총정리 part3 # launchIn 지난 글에 이어서 part3에서는 Coroutine의 Flow에 대해서 정리해 보도록 하겠습니다. 지난 part1과 part2는 아래 링크를 참조해주세요. >> Kotlin Coroutine 총정리 part1 # launch, async, Context, Job, CoroutineScope >> Kotlin Coroutine 총정리 part2 # Cancellation, ExceptionHandling 1. Flow 1-1. Flow Coroutine의 suspend 함수는 비동기이기는 하지만 값을 하나만 return해 줍니다. 지속적으로 혹은 한번에 여러개의 값들이 나오는 경우에 대응하기 위해서 만든, Coroutine의 비동기 스트림 API가 flow입니다. RxJava API를 사용해보았다면 사용방.. 2022. 10. 10.
Kotlin Coroutine 총정리 part2 # Cancellation Exception Handling 이 글은 이전글에 이어서, Exception Handling과 Cancellation 그리고 여러개의 Job을 다룰때의 주의점등에 대해서 정리해 보겠습니다. 참고로 이전 글을 아래 링크를 참조해주세요. >> Kotlin Coroutine 총정리 part1 # launch async Context Job CoroutineScope 1. Exception Handling cancel된 Coroutine은 CancellationException을 전파한다는 것을 알게 되었는데요. 이것은 suspension포인트에서는 무시됩니다. 이것은 cancel을 위한 정상적인 방법이기 때문입니다. 1-1. Exception의 전파 코루틴의 Exception전파에 있어서는 2가지로 나누어 지는데요. Exception 전파 .. 2022. 10. 9.
Kotlin Coroutine 총정리 part1 # launch async Context Job CoroutineScope 오늘은 Kotlin의 Coroutine에 대해서 정리해 보도록 하겠습니다. 1. Coroutine Kotlin에서 네트워크 호출이나 디스크아이오 같은 비동기 코드를 다룰 때 언급되는 것이 Coroutine인데요. 공식문서에서의 Coroutine에 대한 정의를 보면, suspendable한 Computation이라고 나와있습니다. suspend는 중단하다 혹은 유예하다의 뜻 인데요. 필요할 때 마다 suspendable한 단위의 코드들이, suspend 되었다가 다시 깨어나서 resume 하여 과업을 완료한다는 것 입니다. 그리고 Coroutine과 쓰레드는 컨셉적으로는 비슷하지만, 쓰레드는 아닙니다. 한 쓰레드에서 suspend 되었다가, 다른 쓰레드에서 깨어나서 실행될 수 도 있는 좀 더 가볍고 작은 .. 2022. 10. 7.
Coroutine을 이용해 Parallel한 네트워크 호출 #Kotlin Kotlin의 Coroutine을 이용하여서 NetworkCall을 할 경우, 동시에 2개 혹은 3개의 네트워크 API를 호출해야 할 경우 어떻게 해야 할까요? 당연히 A를 먼저하고 끝나면 B를 하는 Sequential한 방법은 사용하지 않을 것이구요. Parallel하게 동시에 호출한 다음 return된 값들을 이용할 텐데요. 오늘은 이것의 방법에 대해서 정리해 보도록 하겠습니다. 1. async와 successHandler Paralllel하게 호출하여 비동기로 결과 값을 받기 위해서는, async 코루틴 빌더를 사용하여야 하는데요. 1-1. async와 successHandler의 사용 동시에 2개의 호출을 한다고 가정해 보겠습니다. 임의의 successHandler를 만들어서 async빌더에서 r.. 2020. 3. 28.
코틀린 Coroutine으로 네트워크 Retry 구현하는 방법 코틀린의 Coroutine으로 네트워크 호출을 할 경우, Retry는 어떻게 구현해야 할 까요. 오늘은 이 방법에 대해서 정리해 보도록 하겠습니다. 1. \ 2020. 3. 24.
Coroutine의 Async와 await 사용시 Exception Handling에 관하여 #Kotlin Coroutine을 사용하면서 한가지 주의해야 할 부분이 있는데요. Async와 await메소드를 사용할 때, Exception Handling에 관한 부분입니다. 오늘은 이것에 관해서 정리해 보겠습니다. 1. await와 Exception Handling Async와 await를 사용하면 예상하지 못한 방식으로 Exception이 catch가 되지 않고, app이 Crash가 나는 현상이 발생하는데요. 참고로 이것은 공식문서에서와 같이 GlobalScope를 사용하면 발생하지는 않는 문제입니다. 다만, GlobalScope를 실제 프로덕트에서 사용하는 경우는 많지 않을 것이기 때문에, 이경우는 제외하였습니다. 코드를 보면서 문제를 파악해 보도록 하겠습니다. 아래와 같이 async블록에서 IOExcept.. 2020. 2. 16.