해당 포스트는 엄재웅 - Compose 성능 최적화를 위한 Stability 마스터하기(https://www.youtube.com/watch?v=bDyhdJk3uZM) 를 보고 간략하게 정리한 내용 & 간단한 개인 의견을 주저리 적어두었습니다.원본 영상은 좋은 내용이 많으니, 보시길 추천드립니다.Stable 로 간주되는 유형원시 타입파라미터가 없는 모든 람다 (파라미터를 넘기는 경우 해당 파라미터가 Stable 인 경우만)(data) class 의 public property 가 불변(val) 이거나 Stable 인 경우(data) class 에 @Stable 이나 @Immutable 을 명시적으로 표기하는 경우 Unstable 로 간주되는 유형(아래 모든 유형은 equals 와 별개로 동작하기 때문에 ..
Retrofit2 사용할 때 혹은 코루틴과 함께 사용할 때 기본으로 WorkerThread 에서 동작한다는 이야기 들어보신적 있으시나요? 항상 WorkerThread 에서 동작한다고 기대하면 안되는 케이스와 기대해도 되는 케이스에 대해 알아보려해요~! 대략 Retrofit2 의 기본 처리, 코루틴의 기본처리, jakewharton 이 제공하는 CoroutineCallAdapterFactory 처리, RxJava 의 기본처리 방식에 대해 알아볼꺼에요. Retrofit2 로 요청을 보내는 로직에 Thread.currentThread().name 을 출력해보면, "OkHttp ${RequstUrl}" 형식으로 출력되고 있을꺼에요. 이는 OkHttp 에서 가지고 있는 WorkerThread 로 동작하고 있다고 ..
오픈 카톡방에서 질문이 올라와서 공유를 위해 작성해둡니다. List(MutableList)를 사용할 때, 갯수가 동일하고 특정 요소의 프로퍼티만 변경하는 경우 StateFlow 의 setValue 까지는 동작하지만, Recomposition 이 발생하지 않아 화면이 업데이트 되지 않는 경우가 존재 합니다. 이는 기본적으로 Kotlin의 List를 Compose 컴파일러는 불안정한 자료구조로 보기 때문에, 사이즈가 동일하고, 한 프로퍼티만 변경된 경우라면, 리스트 자체는 바뀌지 않은 것으로 간주되어 Compose가 이를 감지하지 못할 수 있습니다 그래서 따로 핸들링 해줘야 합니다. (Stable 과 흡사합니다.) 그런 경우 검색해보면, https://velog.io/@jsoh/Jetpack-Compose-..
https://www.youtube.com/watch?v=E6obYmkkdko 를 정리만 해둔 글 입니다. 주요 컨셉 단방향 데이터 흐름 (unidirectional cycle of data) 논블록킹(non blocking) 불변상태(immutable state) 모델(Model)에서 유저(User)의 인텐트(Intent =의도)를 처리하는 시간이 오래걸릴 수 있기 때문에, 데이터 사이클(cycle of data) 을 논블럭(non-blocking) 하는 것이 매우 중요 합니다 상태(state)의 무결성을 보장하는 것이 모델이 하는 일 외부에 의해 상태가 변화 되지 않습니다(immtable) 내부에서는 상태가 변화합니다 인텐트는 네트워크 작업과 같은 비즈니스 작업을 수행하는 변환기(transformer..
FrameLayout 위에 Fragment 를 올려둔다면 Fragment 를 잘못 사용하거나, 구성요소 변경(Configuration change) 로 복원되는 경우 아래와 같은 에러를 만날 수 있습니다. 에러는 간단 합니다 상태를 저장하는 onSaveInstanceState 콜백 이후에 Commit 하려 했으니 상태를 저장할 수 있는 단계가 넘어간 상태이기에 불가능 한 상태라는 의미 입니다. 결국 FrameLayout 위에 Fragment 를 올려두게 되면, 상태에 대해 잘 다뤄줘야 합니다. 상태 저장 상관 없이 사용하고 싶다면 commit 이 아닌, commitAllowingStateLoss 메서드를 명시적으로 호출해줘야 합니다. 기본적으로 FragmentContainerView 는 FrameLayo..
결론만 이야기 드리면 LottieAnimationView 클래스에서 제공하는 setFailureListener 를 구현하면 됩니다. Url 을 통해 Lottie 를 이용할 경우, setAnimationFromUrl 를 사용하게 되는데 코드를 차근차근 보면 CacheComposition (캐시 허용) 이 true 라면 앞의 메서드가 호출되어 cacheKey 에 "url_" prefix 가 붙은 cacheKey 가 넘어가고 아니라면 cacheKey 에는 null 이 들어가게 되고 결과를 LottieTast 자료형의 task 에 담고 있습니다. 그리고 실패하는 경우에는 wrappedFailureListener 콜백 함수를 통해 결과를 넘겨 주고 있습니다. 실패했을 때 보여줄 이미지(fallbackResourc..
아래의 함수는 OneShot 으로 어떤 데이터를 가져올 때 많이 구현하게 되는 코드모양새 입니다. 그리고 aUseCase 에서 어떤 에러가 발생하면 runCatching 에 Catch 되어 최종적으로 onFailure 메서드가 호출 됩니다. fun fetchData() { viewModelScope.launch { runCatching { withContext(Dispatchers.XX) { aUseCase() } }.onSuccess { aResult -> }.onFailure { } } } 하지만 이따금식 여러개의 데이터를 가져와야하는 경우가 있습니다. fun fetchData() { viewModelScope.launch { runCatching { listOf(async { aUseCase() }..
https://lottiefiles.com/supported-features Lottie Supported Features Lottie does not support all features of Adobe After Effects; please refer to the list below for details. lottiefiles.com 에서 각각 플랫폼에서 제공하는 Feature 들을 확인해보자! (저의 경우에는 Layer Effects 를 Android 에서 제공하지 않는 것이 문제 였습니다)