Android 8

[Android] 코루틴 Dispatchers, 하드코딩하지 말고 주입하자

개요 구글의 Codelab의 예제나 안드로이드 공식 문서, 블로그의 코루틴 예시들을 보면 아래의 코드처럼 새로운 코루틴을 생성하거나 withContext를 호출할 때 Dispatchers를 하드코딩하는 경우를 많이 찾아볼 수 있습니다. 하지만 Android의 코루틴 권장사항 문서를 보면 Don't hardcode Dispatchers when creating new coroutines 라는 내용이 제일 먼저 등장합니다. // DO inject Dispatchers class NewsRepository( private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default ) { suspend fun loadNews() = withCont..

Android 2022.08.17

[Android] BottomNavigationView의 탭을 눌러도 선택되지 않는 문제

문제 개인 프로젝트로 개발 중인 앱에서 별다른 버그가 없는가 밥을 먹으며 이리저리 클릭하던 중 특정 상황에 하단 탭의 선택 효과가 동작하지 않는 문제를 발견하여 이를 해결하면서 공부한 내용을 정리했습니다. 문제의 화면과 프로젝트의 내비게이션 그래프의 구성은 아래와 같습니다. 화면 및 탭 구성 BottomNavigationView에는 홈, 즐겨찾기, 설정 총 3개의 탭이 존재 설정 화면의 버튼을 통해 다크 모드 설정 또는 테마 설정 화면으로 이동 가능 버그 내용 설정의 하위에 속하는 다크 모드 설정을 선택하여 화면을 띄운다. 설정 탭 이외의 다른 탭인 즐겨찾기 탭을 선택한다. 다시 설정 탭을 선택하면 화면은 이전에 띄워놓았던 다크 모드 설정 화면이지만 탭은 설정 탭이 아니라 즐겨찾기 탭이 선택되어 있다. ..

Android 2022.07.21

Android Navigation에서 chrome의 의미

요약 chorme은 사용자에게 화면의 콘텐츠(해당 콘텐츠의 일부가 아님)에 대한 정보 또는 작업 명령을 제공하는 시각적 디자인 요소입니다. 이 디자인 요소는 운영체제, 웹사이트, 애플리케이션과 같은 기본 시스템에서 제공되며 사용자 데이터를 둘러싸고 있습니다. 용어 이해하기 안드로이드의 Navigation 관련 문서들을 보다보면 chrome이라는 단어가 종종 등장합니다. NavigationUI Class which hooks up elements typically in the chrome of your application such as global navigation patterns like a navigation drawer or bottom nav bar with your NavController. ..

Android 2022.07.14

제어의 역전(Inversion of Control, IoC) 파헤치기

Inversion of Control(IoC), 제어의 역전이라고도 번역되는 이 개념은 Dependency Injection(DI)에 대한 개념을 찾아보면 반드시 등장하는 개념입니다. 처음 접했을 땐 여러 블로그의 설명을 읽어도 확실하게 이해가 되지 않아서 사전적인 정의와 예시 코드 정도만 정리하고 넘어갔었는데 안드로이드의 DI 라이브러리인 Hilt에 대해 복습을 하던 중 IoC를 간단명료하게 설명해주는 유튜브 영상을 발견하여 스스로 IoC에 대해 다시 한 번 정리하고자 글을 작성합니다. 게임 엔진은 라이브러리가 아니라 왜 프레임워크로 분류하는 것이 적절한 지 IoC에 대한 개념을 함께 설명하는 2분도 안되는 짧은 영상인데, 이 영상에 대해 고마움을 표현하는 댓글들을 읽어보는 재미가 있습니다. 대충 과거..

Android 2022.07.06

[Android] Context의 정의와 종류, 예시

안드로이드 개발에서 Context는 Context.getString(…)을 통해 strings.xml의 문자열 리소스를 가져올 때나 View와 관련된 작업을 별도의 클래스나 함수로 분리하기 위해 파라미터로 Context를 넘기는 등 애플리케이션 내에서 매우 광범위하게 사용된다. 광범위하게 사용된다는 말은 라이프 사이클을 고려해야 된다는 것과 이어질 수 있는데, Context는 잘못 사용하면 애플리케이션의 메모리 누수를 발생시킬 수 있으므로 매우 주의해야 한다! Context가 필요한데 이것을 어디에서 땡겨와야할지 고민하다가 잘못된 Context를 참조하는 경우가 발생할 수 있는데, 이 글을 통해 Context의 개념에 대해 정의하고 내가 개발하면서 어떤 Context를 참조해야할지 고민되었던 코드를 예시..

Android 2022.04.15

Android Dependency Injection(DI, 의존성 주입) 정리

의존성 주입(Dependency injection, DI) 외부에서 하나의 객체가 다른 객체의 의존성을 제공하는 디자인 패턴 의존성(dependency): 클래스가 참조를 필요로 하는 다른 클래스를 의존성이라 한다. 주입(injection): 외부에서 객체를 생성해서 사용하려는 객체에게 전달하는 것 의존성 주입의 의도: 객체 생성과 사용의 관심을 분리하는 것 객체 사이의 결합도를 느슨하게 하고 의존 관계 역전 원칙과 단일 책임 원칙을 따르도록 하여 객체의 생성에 대한 부분을 객체의 사용(행위)와 분리하도록 한다. 단일 책임 원칙(Single Responsibility Principle, SRP) : 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 한다. 의존 관계 역전 원칙(D..

Android 2022.03.21

Android Navigation 관련 용어 정리

NavHost 호스트는 single context 또는 NavController를 통해 탐색하기 위한 컨테이너이다. NavHost를 위한 추가 API들을 제공하는 NavHostController를 인스턴스화하여 nav controller를 구성하는 것이 좋다. NavHostController는 NavHostController로 직접 노출되지 않고 외부에서 NavController로만 액세스할 수 있어야 한다. 내비게이션 호스트는 반드시 컨트롤러의 상태의 저장 및 복원을 처리해야 한다. 호스트의 루트 뷰에서 Navigation.setViewNavController를 호출해야 한다. NavController.popBackStack을 수동으로 호출하거나 NavController를 구성할 때 NavHostCon..

Android 2022.03.07

RecyclerView: Cannot call this method in a scroll callback.

Pagination 구현을 위해 리사이클러뷰에 OnScrollListener를 추가하여 마지막 아이템에 도달하면 프로그래스바가 포함된 아이템을 제거 후, notifyItemRemoved(position) 메서드를 통해 Adapter에 데이터의 변경을 알리는 코드를 작성하였다. 따로 에러가 발생하지는 않았지만 로그창에 스크롤 콜백에서 해당 메서드를 호출할 수 없다는 아래와 같은 메시지가 표시되었다. RecyclerView: Cannot call this method in a scroll callback. Scroll callbacks mightbe run during a measure & layout pass where you cannot change theRecyclerView data. Any meth..

Android 2022.02.23