Android/Kotlin

    [Android/Kotlin] coroutine StateFlow, SharedFlow의 등장

    13일 전, LiveData를 대체 가능할 정도의 추가 기능을 가지고 있는 StateFlow와, 기본적으로 EventBus의 기능을 하리라 기대되는 SharedFlow가 Stable API로 등극되었습니다! (짝짝짝) Release Link Release 1.4.1 · Kotlin/kotlinx.coroutines This is a patch release with an important fix to the SharedFlow implementation. SharedFlow: Fix scenario with concurrent emitters and cancellation of a subscriber (#2359, thanks to @vehovsky for t... github.com 여러 실험을 통해서..

    [Android] WorkManager + Coroutine으로 매일 특정시간에 Notification 띄우기

    매일 오후 12시에 유저에게 '특별한' Notification을 띄울 수 있는 기능을 제공하고 싶었다. 물론 이 방법을 구현하는 데에는 여러 방법이 있을 수 있다. 서버에서 각 유저에게 FCM을 보내는 방법도 있고 (Super Heavy ^^;), 죽지않는 서비스를 구현하여 12시마다 Notification을 띄워주도록 하는 방법도 있을 수 있겠다. 하지만 후자는 구글에서 지속적으로 막으려는 것을 어떻게든 피한 편법에 가깝다. 따라서 구글에서 계속해서 써보라고 제안하고있는 WorkManager을 사용하여 이를 구현하기로 했다. 사실 WorkManager는 꼭 한번이라도 써보고 싶어 예전부터 눈독들여 왔었다. 그동안 죽지않는 서비스 등의 편법으로 백그라운드 처리를 해왔기에, 뭔가 Official 하지 않은..

    [Android/Kotlin] Error Handling By CoroutineExceptionHandler In MVVM Architecture

    viewModel 내에서 Coroutine을 활용하다 보면, 에러 처리를 하기 위해 try ~ catch문을 활용하곤 합니다. 그러나 이를 남용하면 Boiler Plate가 되어버리게 됩니다. 전역적으로 발생할 수 있는 에러들을 CoroutineExceptionHandler을 통해 다루는 방법을 알아봅시다. 구현 방법에 대한 자세한 예시는 링크를 통해 보실 수 있습니다. CoroutineExceptionHandler는 사실 특별한 것이 아닙니다. (배워야 할 게 없다는 것은 아닙니다) 내부적으로는 Thread의 UncaughtExceptionHandler를 구현하는 것으로 작동하기 때문입니다. UncaughtExceptionHandler는 Thread에서 캐치되지 않은 Runtime Exception을 ..

    [Android/Kotlin] CoroutineContext이 구성요소들을 추가하는 방법

    CoroutineScope 변수를 만들 때, Job, CoroutineExceptionHandler, Dispatchers 등을 더하기 연산으로 합쳐서 만들어내곤 합니다. 이것이 어떻게 가능한 것인지 알아봅시다. Coroutine에 배정할 CoroutineContext 변수를 생성할 때, + (덧셈) 연산자로 원소들을 합치고는 합니다 1 2 3 4 5 6 7 open class ExampleViewModel: ViewModel() { protected val coroutineExceptionHanlder = CoroutineExceptionHandler { _, throwable -> throwable.printStackTrace() } protected val ioDispatchers = Dispatc..

    [Android/kotlin] List vs MutableList vs ArrayList vs LinkedList

    📌 List vs MutableList vs LinkedList vs ArrayList 🐳 List와 MutableList의 차이 Kotlin은 많은 변수들을 Mutable 여부로 나누고 있다는 것을 잊지말자. List Collcection에서도 List와 MutableList의 차이는 Read-Only인지 아닌지의 차이이다. 그러나, Compile Time에는 둘다 List로써 인식된다. 이는 MutableList가 List를 상속하여 만들어졌기 때문이다. 결국 둘 다 컴파일 결과로 java.util.List 이 된다. public interface MutableList : List, MutableCollection { ... } 🐬 MutableList와 ArrayList의 차이 MutableList..

    [Kotlin] 함수형 프로그래밍

    📌 함수형 프로그래밍 위키 백과에는, 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임이라 적혀있습니다. 수학적 계산이라 함은, 식으로 표현할 수 있다는 것이고, 이는 같은 값을 넣었을 때는 항상 같은 결과가 나온다는 것 인데요. 이것을 프로그래밍적으로 해결하기 위해 순수 함수와 일급 객체를 사용합니다. 그렇다면 순수 함수와 일급 객체는 무엇일까요? 📒 순수 함수 순수 함수란 같은 인자에 대하여 항상 같은 결과를 반환하며, 외부의 인자를 변경하지 않는 함수입니다. 순수 함수와 비순수 함수의 예시를 보며 비교해봅시다. 순수 함수의 예 fun sum(a: Int, b: Int) = a + b 비순수 함수의 예 var c = 100 fun sum(a: Int, b:..

    [Kotlin] Coroutine 연습 문제

    Coroutine을 공부하면서, 문서를 꼼꼼히 읽어봐도 실전에서는 분명 헷갈리는 부분이 적지 않았다. 그래서 다시 Unit Test를 통하여 연습하던 중에, 이를 문제 - 정답 형식의 문서로 작성해두면 좋을 것 같아 남기게 되었다. 🤔 Coroutine 연습문제 Unit Test 내에서의 결과이기 때문에 상대적으로 긴 런타임을 가지는 실제 상황과는 다른 결과가 나타날 수 있습니다. 그러나 오히려 그렇기에 공부하기에는 더 확실한 방법이므로, 출력의 보장 결과 여부는 Unit Test Runtime 기준으로 합니다. 🕐 문제 1. 출력 결과를 예상하시오. class ExampleUnitTest { @Test fun assert_test() { runBlocking { println("start") /** A..

    [Android/kotlin] Layout Margin dp 단위 변경하기

    📌 Layout Margin dp 단위 변경하기 fun View.margin(left: Float? = null, top: Float? = null, right: Float? = null, bottom: Float? = null) { layoutParams { left?.run { leftMargin = dpToPx(this) } top?.run { topMargin = dpToPx(this) } right?.run { rightMargin = dpToPx(this) } bottom?.run { bottomMargin = dpToPx(this) } } } inline fun View.layoutParams(block: T.() -> Unit) { if (layoutParams is T) block(lay..