Android 9

[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

[Kotlin] 코루틴의 취소와 예외 처리 파고들기

코루틴을 막 학습한 사람에게 코루틴은 매우 간단하고 자바스크립트의 async, await와 비슷하게 보이기도 해서 비동기 프로그래밍을 위한 아주 쉽고 훌륭한 도구로 보일 수 있습니다. 실제로 쉽고 훌륭한 도구이긴 하지만요. 하지만 코루틴을 더 깊게 살펴보면 실제로 걸리기 쉬운 함정들이 많이 존재합니다. 예외 처리나 취소를 try-catch 블록을 통해 간단히 할 수 있으리라 생각하지만 실제로는 복잡한 매커니즘으로 동작하고 있기에 많은 것들이 잘못될 수도 있습니다. 본문에서는 유튜브의 In-Depth Guide to Coroutine Cancellation & Exception Handling 영상을 바탕으로 다음의 내용을 다룹니다. 코루틴에서 어떻게 예외를 잡고 처리해야 하는지 코루틴에서 예외 처리가 일..

Kotlin/Coroutines 2022.07.15

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

[Kotlin] suspend 함수의 실행 원리: 콜백에서 코루틴으로

Coroutines: Replace callbacks & Main safety 코루틴은 콜백 스타일의 코드를 순차적 프로그래밍으로 변경해주고 안드로이드에서 우리의 코드를 main safe하게 만들어준다. main safe하다는 것은 예시로 네트워크 요청을 만드는 코루틴 기반의 함수를 작성할 수 있게 해주고, 그냥 메인 스레드에서 호출해도 아무런 문제가 없다는 것을 뜻한다. 어떻게 코루틴이 이것을 가능하게 해주는지 네트워크 요청을 생성하기 위한 예제 코드를 통해 알아보자. Blocking 스타일 코드 메인 스레드에서 result를 networkRequest()부터 직접 리턴받는 블로킹(blocking) 스타일로 작성한 코드를 보자. 위의 코드에서 networkRequest()는 메인 스레드를 블로킹할 것이..

Kotlin/Coroutines 2022.07.03

[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