전체 글
-
Android) LiveData와 Coroutine Flow 비교해보기Android 2021. 2. 5. 15:16
요즘에 코루틴의 flow를 사용해서 안드로이드 개발을 하고 있는데, LiveData와 함께 flow를 사용 시 올바르게 사용하고 있는 건지에 대한 궁금증이 생겨서 적합한 방법에 대해 글을 써보려고 합니다. Introduction LiveData는 일반적으로 데이터 전송을 위한 용도로 사용됩니다. Flow 또한 고유한 방식으로 데이터를 전송하고 비동기 작업을 수행하는 기능이 있습니다. 둘 다 한계와 장점이 존재합니다. What is LiveData? LiveData는 AAC에서 소개되었고, 대부분의 개발자들은 MVVM 패턴에서 LiveData를 사용하여 ViewModel에서 데이터를 communicate 또는 transfer 하여 메모리 누수를 줄임으로써 수명주기 인식을 보장하고 있습니다. 간단히 말해 L..
-
Android) FloatingActionButton 이미지 색상 변경하기Android 2021. 1. 29. 16:19
[FloatingActionButton] FAB Icon is Always Black 플로팅 액션 버튼에 android:src로 이미지를 넣어주려는데 이미지의 색상이 항상 검은색인 이슈가 발생했습니다. 위와 같은 하얀색의 이미지를 FAB에 넣어보겠습니다. 이미지의 색상이 하얀색임에도 불구하고 FAB에서 이미지의 색상이 검은색으로 보입니다. Solved app:srcCompat 사용 app:tint="@android:color/white" 사용 app:tint="@null" 사용 저는 1번은 적용되지 않았고 2번, 3번으로 해결할 수 있었습니다. 검정색 배경의 FAB에 테두리를 제거하고 3번 방안을 적용한 모습입니다.
-
Kotlin) Coroutine 공식 가이드 번역 06 - ChannelsKotlin 2021. 1. 25. 20:39
Channels Deffered는 코루틴 간에 단일 값을 편하게 전달하는 방법을 제공하지만, Channel은 Stream의 값을 전달하는 방법을 제공합니다. Channel은 Blocking Queue와 유사하게 동작합니다. 차이점은 아래와 같습니다. Blocking Queue Channel put send take receive 동시성이 필요한 여러 코루틴에서 순서를 보장받으면서 공유하여 사용할 수 있습니다. code fun main() = runBlocking { val channel = Channel() launch { for (x in 1..5) channel.send(x * x) } repeat(5) { println(channel.receive()) } println("Done!") } resu..
-
Android) 안드로이드에서 Coroutine의 ViewModelScope와 LiveData Builder 알아보기Android 2021. 1. 21. 16:37
일반적으로 코루틴을 안드로이드 ViewModel과 사용할 때 SupervisorJob을 이용하여 생명주기와 맞물려 사용합니다. ViewModel은 UI에서 보여줄 데이터를 관리하기 위해 사용됩니다. Activity나 Fragment 같은 컴포넌트의 생명주기를 따라가 destroy 됐을 때 onCleared()를 호출하며 해제되는 특징이 있습니다. (SupervisorJob = Job은 모든 자식들을 취소 시킬 수 있지만, SupervisiorJob은 취소가 아래 방향(부모->자식)으로만 전파됩니다.) ViewModel은 bussiness logic(기획적인 부분)을 가지고 있기 때문에 비용이 큰 작업을 처리해야 하는 경우가 있습니다. onCleared()가 호출되고 ViewModel이 메모리에서 해제되면..
-
Kotlin) Coroutine 공식 가이드 번역 05 - Asynchronous Flow(2/2)Kotlin 2021. 1. 20. 23:01
Flow context flow로 만들어진 collection은 항상 이를 호출한 coroutine context에서 수행됩니다. 즉 flow는 context 보존 특성을 가지고 있습니다.이를 context preservation이라 부릅니다. code fun main() = runBlocking { foo().collect { value -> log("Collected $value") } } fun log(msg: String) = println("[${Thread.currentThread().name}] $msg") fun foo() = flow { log("Started foo flow") for (i in 1..3) { emit(i) result [main] Started foo flow [mai..
-
Kotlin) Coroutine 공식 가이드 번역 05 - Asynchronous Flow(1/2)Kotlin 2021. 1. 20. 19:18
기본적으로 suspending funcition은 비동기로 수행되는 연산을 수행한 후 한 개의 값을 반환할 수 있습니다. code suspend fun demoSuspendFun(): List { delay(1000) return listOf(1, 2, 3, 4, 5, 6) } result [1, 2, 3, 4, 5, 6] 이 경우에는 한 번에 모든 데이터를 반환합니다. 하지만 어떤 연산 후 두 개 이상의 값을 반환하려면 어떻게 할 수 있을까요? 각각의 수에 CPU 연산이 요구되는 어떤 일련의 수들을 처리하게 된다면 Sequence를 사용해서 작업할 수 있습니다. code fun longTask1(): List { Thread.sleep(1000) return listOf(1, 2) } fun longT..
-
Android) Android의 여러가지 Annotation (@String,Drawable,ColorRes, @CallSuper)Android 2021. 1. 19. 21:52
@StringRes, @DrawableRes, @ColorRes @StringRes 애너테이션과 @DrawableRes 애너테이션, @ColorRes 애너테이션은 리소스 아이디 관련 애너테이션입니다. 요소의 값이 이 애너테이션들이 의미하는 리소스 타입에 해당하는 리소스의 아이디임을 의미합니다. Android의 모든 리소스는 R 클래스에 의해 int 타입의 아이디로 관리됩니다. 그래서 drawable 타입 리소스의 아이디를 넣어야 할 곳에 문자열 리소스의 아이디나 정수 리터럴을 넣는 등 실수를 범할 수 있는데, @DrawableRes 애너테이션을 활용하면 실수를 방지할 수 있습니다. @StringRes 예제 void setMessage(@StringRes int resId) { mMessage = mCon..