Android

    [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을 통해..

    [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개의 데이터..

    [Android] View와 ViewGroup의 관계

    (1) View 안드로이드에서 사용자가 눈으로 보는 모든 것은 View이다. 화면의 기본적인 컴포넌트라고 얘기 할 수 있다. TextView, ImageView, EditText, ... 등 자주 쓰는 모든 UI 관련된 컴포넌트는 View라는 클래스를 상속 받는다. public class Button extends TextView { .... } public class TextView extends View implements OnPreDrawListener { .... } 그림과 코드에서 보이는 것과 같이, 최상단에 View가 있으며, 모든 UI 관련 컴포넌트는 결국 View를 상속받아 구현된다. View 안에 View를 포함할 수 있으며, 중첩하여 사용 할 수 있다. (2) ViewGroup View..

    [Android, Kotlin] Broadcast Receiver에서의 비동기 백그라운드 작업

    Broadcast Receiver의 경우, onReceive() 함수가 실행 중일 때 시스템에서는 해당 프로세스를 포그라운드 프로세스로 간주하여 심각한 메모리 부족이 아닌 이상 프로세스를 종료시키지 않고 수행한다. onReceive() 함수의 코드가 모두 실행된 뒤 반환을 마치고 나면 비활성 상태로 간주되어 프로세스의 우선순위가 낮아지게 된다. 이는 리소스가 부족할 경우 해당 Broadcast Receiver 프로세스가 onReceive 함수가 완료되기 전에 강제 종료 될 수 있음을 의미한다. 간단한 ACTION_POWER_CONNECTED와 같은 Action 경우에는 짧은 시간 내에 onReceive 함수의 수행을 완료하므로 영향이 없으나, onReceive 함수가 오랜 시간에 걸친 백그라운드 작업을 ..

    [Android, Kotlin] 새로운 Activity를 시작 했을 때의 Lifecycle? Android Activity Lifecycle에 대한 이해

    안드로이드 앱에서 화면 UI를 구성하는 고정된 화면이자 사용자의 진입점이 되어주는 Activity에는 생성과 소멸에 관한 Lifecycle이 존재한다. Activity의 Lifecycle에 대한 이해는 사용자가 앱에서 어떤 행동을 취할 지 모르는 상황에서의 대비를 명확하게 하는 데에 큰 도움을 준다. 예를 들어, 사용자가 앱을 사용 중 전화를 받는다거나 다른 앱으로의 전환 등의 동작을 할 때 우리가 만든 소중한 앱은 어떤 상태로 바뀌는지 알아야 할 것이고, 앱이 백그라운드 상태에 있을 때 어떤 행동을 취해야 하는지를 정의하는 데에 있어 Lifecycle에 대한 이해는 필수적이다. Activity와 Fragment는 비슷하지만 조금 다른 Lifecycle을 가지고 있다. 이번 글에서는 Activity의 L..

    [Android, Kotlin] Gradle / build.gradle(project)와 build.gradle(module) 차이

    안드로이드 앱 개발을 위해 안드로이드 스튜디오에서 프로젝트를 생성하면 함께 따라오는 녀석이 있다. 너무나 당연하게 있어서 익숙한 이것이다. *.gradle 파일들은 대체 무엇일까? Gradle은 작성한 소스 코드와 의존성 라이브러리들을 묶어서 APK 등 배포할 수 있는 형태로 패키징 해주는 빌드 배포 도구 (Build ToolKit) 이다. Android 공식 문서를 참고해보자. 공식 문서에서 알 수 있듯이, Gradle은 안드로이드 스튜디오와는 독립적으로 실행된다. 안드로이드 스튜디오에는 별도의 빌드 툴킷이 존재하지 않으므로, 안드로이드 스튜디오는 빌드 툴킷으로 Gradle을 채택하여 사용하는 것이다. 안드로이드 스튜디오는 IDE(Integrated Development Environment, 통합 개..

    [Android, Kotlin] Recycler View 안에 Recycler View 넣기, 중첩 RecyclerView

    토이프로젝트로 영화 박스오피스 앱을 만들면서 꽤나 시간이 걸렸던 부분에 대해 기록한다. 본 영상처럼 Vertical Grid RecyclerView 안에 Horizon Linear RecyclerView를 넣도록 구현하고자 했다. class HomeAdapter : RecyclerView.Adapter() { private var data: List = emptyList() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { TYPE_HEADER -> HeaderViewHolder(ItemHeaderBinding.inflate (LayoutInfl..