[Coroutine] Callback을 Flow로 변환 - callbackFlow coroutine을 정리하면서 같이 정리했던 flow 부분에 유용한 변화들이 발생하여 추가된 flow들에 대해서 추가적인 정리를 하려고 합니다. 기존 글을 작성했을 당시 (2019.11) coroutine이 v1.3.2 정도였는데, 벌써 v1.6.0-RC가 나온 상태입니다. 곧 정식 1.6.0이 나오겠지만, 그사이 추가된 coroutine 관련 api들을 시간 날 때마다 추가하여 정리하도록 하겠습니다. 예제 생성 callbackFlow는 Flow라기 보단 flow builder라는 표현이 더 맞을것 같습니다. 이름에서 보이듯이 callback을 flow로 변경합니다. 기존에는 비동기 처리를 위해 callback 구조를 많이 사용하기도 했고, 여타 라이브러리들나 SDK들이 callback으로 응답을 주는 .. 개발이야기/Kotlin 3년 전
[Kotlin] Coroutine - CoroutineDispatcher.limitedParallelism coroutine 1.6.0-RC에서 limitedParalleism이란 API가 추가되었습니다. 이는 특정 목적에 따라서 하나의 실행 flow를(isolated serializable execution flow) 가져가려고 할때를 위한 api 입니다.[1] 이 API는 이전에 제공하던 newFiexedThreadPoolContext와 newSingleThreadContext를 대체하기 위함입니다. newFixedThreadPoolContext는 아래와 같은 경우에 사용했었습니다. // 최대 10개까지 DB에 동시 접속하도록 Pool 생성 al DB = newFixedThreadPoolContext(10, "DB") //사용 withContext(DB) {...} 이렇게 최대 사용 가능한 개수를 제한하기.. 개발이야기/Kotlin 3년 전
[Android, MVVM, Coroutine] 활용 #3 - ViewModel, LiveData의 Coroutine 이 글은 아래 포스팅을 기반으로 작성되었으며, 상세한 내용은 링크에서 확인하시기 바랍니다. 2019/11/14 - [개발이야기/Android] - Easy Coroutines in Android: viewModelScope https://developer.android.com/topic/libraries/architecture/coroutines#livedata https://proandroiddev.com/the-death-of-presenters-and-the-rise-of-viewmodels-aac-f14d54b419a ViewModel도 Activity나 Fragment처럼 생명주기를 갖습니다. 따라서 ViewModel의 생명 주기에 맞춘 Coroutine Scope을 설정한다면 coroutine.. 개발이야기/Android 5년 전
[Android, MVVM, Coroutine] 활용 #2 - Room에서 Coroutine 사용 이전 포스팅에서 Android에서 Coroutine이 사용 가능하도록 설정 된 상태라면 Room에서 coroutine을 이용한 DB 접근방법에 대해서 알아봅니다. 상세내용이 담긴 포스팅 2019/11/25 - [개발이야기/Android] - Android Room & Coroutines 2019/11/04 - [개발이야기/Kotlin] - [Kotlin] 코틀린 - 코루틴#10- Asynchronous Flow(1/2) 2019/11/16 - [개발이야기/Kotlin] - [Kotlin] 코틀린 - 코루틴#11- Asynchronous Flow(2/2) room 2.1에서 부터 coroutine을 지원하기 시작했고 room 2.2부터 Flow를 지원합니다. 실제로 이 두가지를 어떻게 호출하고 사용하는지 .. 개발이야기/Android 5년 전
Android Room & Coroutines 해당 내용은 하기 링크를 번역한 내용입니다. https://medium.com/androiddevelopers/room-coroutines-422b786dc4c5 물론 추가적인 의역 및 설명이 추가되어 있습니다.Room 2.1에서 부터 Kotlin coroutine을 지원하기 시작했습니다. 2.2 버전부터는 return값으로 flow도 제공하지요~ Room에서 coroutine을 지원하면서 DAO에서 suspend function을 만들어 선언해 놓으면 해당 function들은 main thread에서 동작하지 않습니다. 따라서 DB 접근할때 따로 background thread를 만들어서 접근할 필요가 없어졌습니다. 아래에서는 이를 사용하는 방법과 내부적으로 어떻게 동작하는지와 test는 어떻게 진행해.. 개발이야기/Android 5년 전
[Kotlin] 코틀린 - 코루틴#11- Asynchronous Flow(2/2) 이 글은 아래 링크의 내용을 기반으로 하여 설명합니다.https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md이 블로그 포스팅 당시의(2019.11.04) coroutine 버전은 1.3.2 입니다. 첫번째 글에 이어 포스팅 합니다.Flow 첫번째 정리 포스팅: https://tourspace.tistory.com/258 Flow contextflow로 만들어진 collection은 이를 호출한 caller의 coroutine context에서 수행되며, 이를 context preservation(context 보존) 이라고 부릅니다.따라서 collect() 함수 또는 기타 terminal api를 호출하는 coroutine.. 개발이야기/Kotlin 5년 전
Android Dev Summit 2019 - Testing Coroutines on Android 안드로이드 2019 Dev Summit에서 발표된 Testing Coroutines 자료를 정리합니다. Coroutines-first안드로이드 UI Component를 개발할때 코루틴을 염두해 두고 개발합니다.New APIs : 만약 새로운 API가 추가된다면 코루틴에 맞는지 살펴보고, API 대해 코루틴을 잘 지원할수 있는지 검토합니다.Jetpack Library: 라이브러리를 빌드할 때도 코루틴을 사용하며, 라이브러리중 일부에서는 이미 그렇게 하고 있습니다.Documentation: 안드로이드에서 코루틴을 사용하는 방법에 대한 develop.android.com에 문서화 작업을 진행하고 있습니다.이미 4개의 라이브러리에서 안정적으로 즉시 사용 가능한 코루틴을 지원합니다 또한 나머지 기능들 역시 안정적.. 개발이야기/Android 5년 전
Easy Coroutines in Android: viewModelScope 안드로이드 Summit 2019를 보던중 Testing coroutine section에 갑자기 viewModelScope이란게 튀어 나옵니다...분명 coroutineScope이긴 할텐데, ViewModel에 한정시킨 버전인듯한데..라고는 가늠해 보지만 세미나를 진행해야 하는 입장이라 명확한 viewModelScope에 대한 글을 정리했습니다.이 글은 하기 링크를 번역했습니다.https://medium.com/androiddevelopers/easy-coroutines-in-android-viewmodelscope-25bffb605471 Coroutines의 취소는 단조롭고 번거로운 작업으로 심지어 까먹기도 쉽습니다.viewModelScope은 extension property를 ViewModel에 추.. 개발이야기/Android 5년 전
[Kotlin] 코틀린 - 코루틴#10- Asynchronous Flow(1/2) 오랬만에 코루틴 페이지에 들어갔더니 coroutine builder가 추가되었네요.그리고 channel도 experimental flag가 떼졌습니다.(너무 오랬만에 들어가 봤나요?) 여튼 channel 사용이 가능해 지면서 actor의 사용도 가능해 졌으니, 동기화 부분에서도 좀더 코틀린 스럽고 코루틴스럽게 작성이 가능해 졌습니다.그럼 새로 추가된 builder들에 대해서 알아봅니다. 이 글은 아래 링크의 내용을 기반으로 하여 설명합니다.https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md이 블로그 포스팅 당시의(2019.11.04) coroutine 버전은 1.3.2 입니다. Asynchronous FlowSuspen.. 개발이야기/Kotlin 5년 전
[Kotlin] Coroutine의 배신 최근에 Coroutine을 메인 프로젝트에 반영해서 썼습니다. "쓰레드 따위...개나 줘버려.."라는 생각으로 코루틴을 적용해 보니 신세계 입니다.지긋지긋한 콜백구조와 Thread safe를 신경써야 했던 부분들이 너무나도 손쉽게 해결되면서 "역시 사람은 배워야되"를 연발했었죠. 획기적으로? 줄어든 코드량과 더불어 복잡도가 떨어지는 코드등 장점도 많은 반면에, 개념을 모르면 리뷰도 못한다라는 막강한 단점까지 있습니다. 하여튼..코루틴을 적용해 보면서 겪었던 문제들을 나열해 보려 합니다.그리고 결론적으로 코루틴은 다음 프로젝트 부터는 사용하지 않는걸로 결정 내렸습니다. 정확하게 말하면 사용 못합니다.사용할때 신세계 였는데, 배포하고나서 crash난걸 보니..@.@ 장점은 찾아보면 다른 블로그에도 여기저기 .. 개발이야기/Kotlin 6년 전
[Kotlin] 코루틴 Exception 추가 예제 Exception에 대하여 이전에 내용을 다뤘습니다.하지만 예제의 내용만으로는 부족한게 많습니다. 따라서 여기서는 조금씩 상황을 바꿔가면 테스트를 진행하고 그 결과에 대해서 확인합니다. 혹시라도 아직 coroutine의 exception에 대해서 읽지 않으신 분은 https://tourspace.tistory.com/154?category=797357 를 먼저 확인하시기 바랍니다위 글에서 언급했던 기본 예제 코드는 아래와 같습니다.GlbalScope 내부에서 launch를 하고 그 안에서 exception을 발생 시킵니다.fun main() = runBlocking { val handler = CoroutineExceptionHandler { _, exception -> println("Caught or.. 개발이야기/Kotlin 6년 전
[Kotlin] 코틀린 - 코루틴#9 Select (Experimental) 이 글은 아래 링크의 내용을 기반으로 하여 설명합니다. https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md 또한 예제에서 로그 print시 println과 안드로이드의 Log.e()를 혼용합니다. Select expression (experimental)여러개의 suspending function을 동시에 대기하고 사용 가능한 상태인 경우에는 선택이 되도록 할 수 있는 API 입니다. 하지만 Experimental 기능으로 추후 대거 변경될 가능성이 있으니 개념만 이해하시면 됩니다. (나중에 api명 자체가 바뀔수도 있으니까요..) Selecting from channelschannel의 값을 읽으려면 receive를 .. 개발이야기/Kotlin 6년 전
[Kotlin] 코틀린 - 코루틴#8 - 동기화 제어 이 글은 아래 링크의 내용을 기반으로 하여 설명합니다. https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md 또한 예제에서 로그 print시 println과 안드로이드의 Log.e()를 혼용합니다.Shared mutable state and concurrency코루틴은 Dispathcer.Default같은 dispatcher를 이용해서 multi-thread에서 동작이 가능합니다.따라서 공유된 변경가능한 상태에 접근하는 경우 multi-thread가 접근하는 경우 문제가 발생합니다.이를 해결하기 위한 방법은 일반적으로 multi-thread에서 공유 객체에 접근할때와 같은것들도 있고, 코루틴만의 특수한 방법들이 있습니다... 개발이야기/Kotlin 6년 전
[Kotlin] 코틀린 - 코루틴#7 - Channels 이 글은 아래 링크의 내용을 기반으로 하여 설명합니다.https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md 또한 예제에서 로그 print시 println과 안드로이드의 Log.e()를 혼용합니다. ChannelsChannels은 현재 (2018.12.17) experimental 기능이기 때문에 추후 API의 대대적인 변화가 있을수도 있습니다.따라서 직접 사용하기 보다는 API와 컨셉을 확인하는 용도를 추천드립니다.괜히 코드에 넣어다가 kotlin 버전올라가고 다 바꿔야 하는 낭패를 볼 수도 있습니다.... 2019.10.28 현재 Experimental이 제거되었습니다. (정식사용 가능함)정확하게 언제버전부터인지는 확인.. 개발이야기/Kotlin 6년 전
[Kotlin] 코틀린 - 코루틴#6 - supervision 이 글은 아래 링크의 내용을 기반으로 하여 설명합니다.https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md 또한 예제에서 로그 print시 println과 안드로이드의 Log.e()를 혼용합니다. 코루틴에서 Exception은 자식, 부모 양방향으로 전부 전달됩니다.UI component 같은곳에서 하나의 Job을 사용하면 UI 자체를 destroy하거나 화면을 떠나는 경우 모든 자식들을 취소 시킬 수 있습니다.다만, 자식중 하나가 실패되면 모든 UI component가 취소되는 상황도 같이 일어납니다. Supervision job이렇게 한방향으로만 취소를 전달하기 위한 방법으로 SupervisorJob이 있습니다.Sup.. 개발이야기/Kotlin 6년 전
[Kotlin] 코틀린 - 코루틴#5 - exception 이 글은 아래 링크의 내용을 기반으로 하여 설명합니다. https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md 또한 예제에서 로그 print시 println과 안드로이드의 Log.e()를 혼용합니다. Exception propagationCoroutine builder들을 Exception handling 측면에서 두가지 타입으로 나뉩니다.Exception을 외부로 전파(propagation) 시킴: launch, actorException을 노출(exposing)시킴: async, produce언뜻 보기엔 말장난 같습니다.fun main() = runBlocking { val job = GlobalScope.launch .. 개발이야기/Kotlin 6년 전
[Kotlin] 코틀린 - 코루틴#4 - context와 dispatchers 이 글은 아래 링크의 내용을 기반으로 하여 설명합니다. https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md 또한 예제에서 로그 print시 println과 안드로이드의 Log.e()를 혼용합니다. coroutine은 항상 kotlin standard library에 정의된 CoroutineContext로 대표되는 어떤 context에서 실행됩니다. corouitne의 context는 어려 요소의 set으로 구성되며, main 요소는 Job과 dispatcher 입니다. Dispatchers and threads coroutine context는 어떤 쓰레드에서 해당 coroutine을 실행할지에 대한 dispatcher.. 개발이야기/Kotlin 6년 전
[Kotlin] 코틀린-코루틴#3 - suspending function의 구성 이 글은 아래 링크의 내용을 기반으로 하여 설명합니다. https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md 또한 예제에서 로그 print시 println과 안드로이드의 Log.e()를 혼용합니다. Sequential is default기본적으로 code는 sequential하게 수행됩니다. 이는 coroutine 내부에서도 동일하게 적용 됩니다. (당연하겠죠?)먼저 아래와 같이 시간이 걸리는 작업을 하는 의미있는 함수가 있다고 가정합니다.(remote service call이 될수도 있고, computation을 하는 작업일수도 있습니다.) 먼저, 예제에서 공통으로 사용하기 위한 suspend 함수를 생성합니다.susp.. 개발이야기/Kotlin 6년 전
[Kotlin] 코틀린 - 코루틴#2 취소와 Timeout 이 글은 아래 링크의 내용을 기반으로 하여 설명합니다. https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md 또한 예제에서 로그 print시 println과 안드로이드의 Log.e()를 혼용합니다.Cancelling coroutine executioncoroutine도 취소해야할 경우가 있습니다. backgroud 작업을 진행중에 페이지가 넘어가서 더이상 결과가 필요하지 않다면 취소해야 겠지요?이를 위해 launch function이 return하는 Job을 이용합니다. import kotlinx.coroutines.* fun main() = runBlocking { val job = launch { repeat(1000.. 개발이야기/Kotlin 6년 전
[Kotlin] 코틀린 - 코루틴#1 기본! 이 글은 아래 링크의 내용을 기반으로 하여 설명합니다.https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md 또한 예제에서 로그 print시 println과 안드로이드의 Log.e()를 혼용합니다. 코루틴의 시작import kotlinx.coroutines.* fun main() { GlobalScope.launch { // launch new coroutine in background and continue delay(1000L) // non-blocking delay for 1 second (default time unit is ms) println("World!") // print after delay } printl.. 개발이야기/Kotlin 6년 전