본문 바로가기

프로그래밍 놀이터/Kotlin, Coroutine70

[coroutine] Flow vs RxJava - 이 글은 RxJava 는 써보고, Flow 는 안 써본 개발자 입장에서 정리한 글. Core functionality - view state 와 effects 를 만들고 업데이트 하기 위해 coroutine 1.3.6 부터는 StateFlow 와 MutableStateFlow 를 제공한다. Retrofit - // Flow interface FeedService { @GET("lists/{listType}") suspend fun getTweets( // suspend 를 붙여준다. @Path(LIST_TYPE_PATH listType:String, @Query(LIST_ID_QUERY) listId:String, @Query(LIST_COUNT_QUERY) count:String, @Query(LI.. 2021. 5. 10.
[coroutine] SharedFlow & StateFlow StateFlow - StateFlow 는 observable flow 로 collector 에게 현재값과 업데이트 되는 새로운 값을 전달하는 녀석이다. 현재 값을 value property 를 통해 읽을 수도 있다. state 를 update 하고 flow 에게 그 값을 보내기 위해서는 MutableStateFlow 에 value 값을 설정해주면 된다. flow { } builder 로 만든 녀석들은 cold flow 이지만, StateFlow 는 hot flow 이다. 따라서 collect 하는 순간 최신 값을 전달받는다. - class LatestNewsViewModel(private val newsRepository: NewsRepository) : ViewModel() { // Backing p.. 2021. 5. 8.
[kotlin] LazyThreadSafeMode SYNCHRONIZED vs. PUBLICATION - lazy 함수의 기본 thread-safe 동작은 SYNCHRONIZED 이다. 즉 thread-safe 하다는 말이다. - SYNCHRONIZED 는 우리가 익히 알고 있는 동기화가 보장된 호출이다. 한 thread 에서만 접근할 수 있고, 해당 연산이 끝난 결과값을 다른 thread 에서 공유해서 사용하는 방식이 된다. - PUBLICATION 은 초기화 과정을 여러 스레드가 동시에 수행할 수 있으나, 다른 스레드에서 초기화하여 할당된 값이 있다면 그 값을 반환한다. 다시 말해 init 코드는 여러 번 탈 수 있으나 race condition 에서 한 thread 에 의해 최초 write 된 값을 모든 thread 에서 share 해서 사용하는 방식이 된다. - NONE 은 별도의 thread-s.. 2021. 1. 28.
[Kotlin] Coroutine 소개 https://www.slideshare.net/elizarov/introduction-to-kotlin-coroutines -Coroutine 개념은 아주 오래된 녀석이다.Simula 67 이란 언어에서 처음으로 소개된 개념이다. detach : suspension statement resume : resume coroutine execution -Coroutine 은 multithreading 이 나오면서 잠시 out 되어있었다.그러나 최근에 async code 가 많이 사용되면서 다시 주목받기 시작했다. -Thread 는 resource 측면에서 high-load 이며,single thread 만 지원하는 언어들도 있으며,mutable state 가 많고, UI operation 같이 thread .. 2020. 8. 24.
[Kotlin] Coroutine 은 어떻게 동작하는가? 코루틴은 어떻게 동작하는가? -돼욍 CommentCoroutine 이 StateMachine 형태로 동작함을 rough 하게 이해할 수 있다.StateMachine 의 상태 변화에 따라 값을 save & fetch 한다는 것을 rough 하게 이해할 수 있다.Continuation 이라는 것을 재활용해 Dispatcher 를 포함한 context 를 계속 물고 갈 수 있음을 rough 하게 이해할 수 있다. -Kotlin 의 Coroutine 은 suspend 키워드로 마킹된 함수를 CPS(Continuation Passing Style)로 변환하고, 이를 Coroutine Builder 를 통해 적절한 스레드 상에서 시나리오에 따라 동작하도록 구성된다. -suspend function 은 스레드와 스케.. 2020. 8. 23.
[coroutine] java.lang.IllegalStateException: Module with the Main dispatcher is missing. Add dependency providing the Main dispatcher, e.g. 'kotlinx-coroutines-android' -coroutine 을 사용한 project 에서 release build (minify 포함) 을 하면 아래와 같은 exception 이 발생하며 crash 가 발생한다.java.lang.IllegalStateException: Module with the Main dispatcher is missing. Add dependency providing the Main dispatcher, e.g. 'kotlinx-coroutines-android’ -범인은 바로 proguard.proguard 파일은 version 에 따라 바뀔지 모르지만, 아래 링크를 참조하면 최신정보를 계속 얻을 수 있지 않을까 싶다. https://github.com/Kotlin/kotlinx.coroutines/blob/maste.. 2020. 8. 16.
[Kotlin] check lateinit is initialized (safely accessing lateinit vars) https://blog.jetbrains.com/kotlin/2017/09/kotlin-1-2-beta-is-out/ -Exception in thread "main" kotlin.UninitializedPropertyAccessException 위의 exception 을 마딱뜨린 사람이 은근 많을 것이다.그렇다 저 녀석은 lateinit 이라고 선언된 var 에 값이 assign 되기 전에 접근할 때 생기는 exception 이다. -Kotlin 1.2 에서 추가된 기능이 있는데, 바로 reflection 방식을 이용한 isInitialized 함수이다.lateinit var file:File // ... if (::file.isInitialized) { ... } -reflection 방식이기 때문에.. 2020. 8. 12.
[Kotlin] Kotlin 으로 build gradle 을 작성하자! https://proandroiddev.com/migrating-android-app-to-gradle-kotlin-dsl-1-0-c903760275a5 -gradle 4.9 이상 버전부터 사용 가능하다.Kotlin DSL 은 gradle build script 를 지원하는 kotlin 언어이다.( 기존에 우리가 쓰던 것은 groovy ) -Kotlin DSL 은 groovy 방식에 비해 IDE 에서 제공하는 다음의 기능들을 함께 제공한다. Auto-completionContent assistQuick documentationNavigation to source codeRefactoring and much more -android studio 도 최신 버전을 사용하는 것이 추천된다. -kts 는 Grad.. 2020. 8. 10.
[kotlin] safe when statement http://blog.karumi.com/kotlin-android-development-6-months-into-it/ - when 을 expression 으로 사용될 때에는 cover 하지 않는 케이스에 대한 else 가 꼭 필요하다. 하지만 statement 로 사용될 때에는 꼭 쓰지 않아도 괜찮다. (강요되지 않는다.) 이 때문에 모든 case 를 커버하는지 알 수 없었다. 아래와 같이 Any? 에 대한 extension 으로 exhaustive 를 줌으로써 expression 처럼 쓰도록 하여 에러를 줄일 수 있다. val Any?.exhaustive get() = Unit private fun onStatusChanged(status:Status){ when(status){ is Status... 2020. 8. 9.
반응형