전체 글

전체 글

    [Android, Kotlin] Room DB에서 Flow를 사용하여 DB 변경 observing

    조건 : 찜한 글 목록에서 글 클릭 -> 클릭한 글의 detail 화면에서 찜 해제 시 DB에서 찜한 글 목록이 바로 업데이트 됨 -> 다시 찜한 글 목록으로 돌아왔을 때 업데이트 된 찜한 글 목록이 나오도록 해야 함. 문제 : 다시 찜한 글 목록으로 돌아왔을 때 찜한 글이 update되지 않음. // FavoritePostViewModel.kt val posts: StateFlow = favoriteRepository.getAllPosts() .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5000), initialValue = Result.Uninitialized ) ViewModel에서는 Repository에서 g..

    [Android, Kotlin] Coroutine Flow block 내에서 여러 개의 suspend function에 대한 비동기 처리

    조건 : retrofit을 활용한 api 통신을 수행하는 2개의 suspend function을 통해 flow block에서 댓글 목록과 글쓴이의 정보를 가져와 PostInfo 객체로 wrapping 하여 emit해야 함. 발생한 문제 : 2개의 suspend function으로 인해 각 suspend function이 끝날 때 까지 해당 flow block이 suspend되므로 연관이 없는 api 통신임에도 불구하고 동기적으로 수행되어 api 통신 속도가 느려짐. 이로 인해 function 시작부터 comments, user를 emit하는 데까지 걸리는 시간은 평균 1.2 ~ 1.3초가 소요됨. 해결 : 처음에는 두 flow를 합치는 zip 연산자를 통해 두 api 연산을 asFlow로 flow로 변환..

    [Android, Kotlin] ViewPager2의 currentItem 설정이 동작하지 않는 문제

    원하는 동작 : ImageListFragment에서 RecyclerView의 이미지 리스트 중 하나를 클릭하면 클릭한 이미지의 Position을 받아와 GalleryFragment에서 ViewPager 형태로 해당 이미지를 보여준다. ViewPager2의 current position을 이미지의 position으로 설정한다. 발생한 문제 : current position 설정과 관계 없이 리스트의 첫번째 이미지가 보여진다. 기존 코드 : // RecyclerViewBinding.kt @JvmStatic @BindingAdapter("submitListViewPager") fun bindSubmitListViewPager(view: ViewPager2, list: Array) { (view.adapter ..

    [Android, Kotlin] 제네릭의 in, out 키워드는 무엇일까?

    (0) 학습 계기 깃허브의 좋은 소스코드 예제를 분석하며 공부 중, 몇 번씩 봐왔지만 정확한 의미는 몰랐던 in, out에 관한 키워드가 등장했다. 문제의 소스코드다. 필요한 부분만 축약해서 보자. sealed class Result { data class Success(val data: T) : Result() object Empty : Result() companion object { fun successOrEmpty(list: List): Result { return if (list.isEmpty()) Empty else Success(list) } } } sealed class로 Result를 정의하는 코드이다. in, out가 무엇인지 몰랐으므로 저 out이 없으면 뭐가 문제인지도 몰랐다. 그래..

    [Android, Kotlin] Hilt에서 @Binds와 @Provides의 차이점

    Android에서 * DI (의존성 주입)를 도와주기 위한 라이브러리인 Hilt를 학습하여 사용 중이다. * DI : https://hungseong.tistory.com/10 DI(Dependency Injection), 의존성 주입 Dependency 의존성 함수에 필요한 클래스, 객체 등에 의존하는 것. 한 객체가 다른 객체를 참조(다른 객체와 상호작용)하는 것 위 같은 코드에서 DefaultRestaurantFoodRepository 클래스는 FoodApiService에 종.. hungseong.tistory.com (1) constructor inject Hilt를 사용 하면서, 다음과 같이 프로젝트 내에서 클래스의 인스턴스를 Hilt에게 바로 제공 할 수 있는 경우에는 따로 Module을 통해..

    [Kotlin] object / companion object를 통한 Java의 static 키워드 대체

    (1) Kotlin의 object 코틀린에서의 object 키워드는 두가지 형태로 사용 할 수 있다. - object declarations(선언식) - object expressions(표현식) 1. object declarations(선언식) : Singleton object를 선언식으로 사용하게 된다면 Singleton 형태로 사용할 수 있다. 코틀린에서 object를 선언식으로 사용하는 문법은 다음과 같다. object Singleton { ... } 본 코틀린 코드를 자바로 디컴파일 해보면 다음과 같다. public final class Singleton { public static final Singleton INSTANCE; static { Singleton var0 = new Singlet..

    [Android] Exception 종류와 내용

    ClassNotFoundException 클래스를 찾지 못함 CloneNotSupportedException 인터페이스를 미구현함 IllegalAccessException 클래스에 접근 불가함 InstantiationException 추상 클래스, 인터페이스를 인스턴스화 하고자 함 InterruptedException Thread가 중단됨 NoSuchFieldException 지정된 필드가 없음 NoSuchMethodException 지정된 메소드가 없음 [IOException] CharConversionException 문자 변환에서 예외 발생함 [IOException] EOFException 파일의 끝에 도달함 [IOException] FileNotFoundException 파일을 찾지 못함 [IOE..

    [Android, Kotlin] 멀티 스레드 간 통신을 위한 Handler, Looper

    안드로이드는 기본적으로 Main Thread (or UI Thread) 하나만으로 구성되는 Single Thread Model로써 동작한다. Single Thread Model의 2가지 원칙은 다음과 같다. 1. Main Thread를 Block 하지 말 것 2. Android UI ToolKit (TextView, ImageView, etc..)은 Main Thread에서만 접근할 수 있도록 할 것 이러한 Single Thread Model을 추구하는 이유를 간단하게 보고 넘어가자. 구글링을 통해 Handler, Looper, Thread를 검색하면 나오는 아주 좋은 예시가 있다. 다음과 같은 멀티 스레드 환경에서 Main Thread와 Worker Thread가 동시에 textView의 text를 변..

    [Android, Kotlin] Fragment Lifecycle 상황별 동작 순서 (add, replace, back stack)

    (1) Activity 및 FirstFragment 최초 생성 및 attach Activity, Fragment 최초 생성의 경우 모두 같은 순서를 가짐. (2) SecondFragment 생성 [ Add, Add(backstack) ] 기존 FirstFragment의 변화 없이 SecondFragment 생성됨 [ Replace ] First Fragment onPause -> onStop Second Fragment onAttach ~ onStart First Fragment onDestoyView ~ onDetach Second Fragment onResume [ Replace(backstack) ] First Fragment onPause -> onStop Second Fragment onAtta..

    [Android, Kotlin] RecyclerView의 성능 개선, DiffUtil과 ListAdapter

    RecyclerView의 Adapter는 RecyclerView에서 다음과 같은 역할을 한다. 데이터 리스트를 관리하여 포지션에 맞게 ViewHolder의 View와 연결하여 표시하는 중간자 기존 RecyclerView.Adapter를 사용할 경우 위 역할 중 데이터 리스트를 포지션에 맞게 표시하는 부분에서 비효율적인 방식이 나타난다. 기본적으로 새로운 데이터가 추가,삭제,변경 되었을 때 notifyDataSetChanged()를 통해 리스트 전체를 업데이트 한다. private fun updateList(list: List) { adapter.dataList = list adapter.notifyDataSetChanged() // 리스트 변경을 adapter에 알림 } 그러나 만약, 1000개의 데이터..