[Android] 코루틴 Dispatchers, 하드코딩하지 말고 주입하자
개요
구글의 Codelab의 예제나 안드로이드 공식 문서, 블로그의 코루틴 예시들을 보면 아래의 코드처럼 새로운 코루틴을 생성하거나 withContext를 호출할 때 Dispatchers를 하드코딩하는 경우를 많이 찾아볼 수 있습니다.
[Android] 코루틴 Dispatchers, 하드코딩하지 말고 주입하자
구글의 Codelab의 예제나 안드로이드 공식 문서, 블로그의 코루틴 예시들을 보면 아래의 코드처럼 새로운 코루틴을 생성하거나 withContext를 호출할 때 Dispatchers를 하드코딩하는 경우를 많이 찾아볼 수 있습니다.
안드로이드 개발에서 Context는 Context.getString(…)을 통해 _strings.xml_의 문자열 리소스를 가져올 때나 View와 관련된 작업을 별도의 클래스나 함수로 분리하기 위해 파라미터로 Context를 넘기는 등 애플리케이션 내에서 매우 광범위하게 사용된다.
광범위하게 사용된다는 말은 라이프 사이클을 고려해야 된다는 것과 이어질 수 있는데, Context는 잘못 사용하면 애플리케이션의 메모리 누수를 발생시킬 수 있으므로 매우 주의해야 한다! Context가 필요한데 이것을 어디에서 땡겨와야할지 고민하다가 잘못된 Context를 참조하는 경우가 발생할 수 있는데, 이 글을 통해 Context의 개념에 대해 정의하고 내가 개발하면서 어떤 Context를 참조해야할지 고민되었던 코드를 예시로 정리하고자 한다.
MVVM 아키텍처가 매력적인 이유 중 하나는 **단위 테스트(unit testing)**가 쉽기 때문이다. 단위 테스트는 앱의 각 단위가 제대로 작동하는지 검사하는 작은 프로그램들을 작성하는 것이다.
본문에서는 단위 테스트 및 안드로이드 오디오 API를 쉽게 사용하도록 해주는 도구인 SoundPool 클래스를 사용한다. SoundPool 클래스는 많은 음원 파일을 메모리로 로드할 수 있으며, 재생하려는 음원의 최대 개수를 언제든 제어할 수 있다. 따라서 사용자가 앱의 모든 버튼을 동시에 마구잡이로 누르더라도 앱의 실행이나 장치에는 영향을 주지 않는다.
앱에 포함된 여러 음원을 사용자가 조회하고 들을 수 있는 BeatBox라는 새로운 프로젝트를 통해 데이터 바인딩 data binding 이라는 Jetpack 아키텍처 컴포넌트 라이브러리를 사용하는 방법을 배운다. 그리고 데이터 바인딩을 사용해서 MVVM(Model-View-View Model) 아키텍처를 구현하고 애셋 asset 시스템을 사용해서 음원 파일을 저장하는 방법도 알아본다.
[Android] 암시적 인텐트를 이용한 촬영 및 저장
암시적 인텐트를 사용해 사용자의 카메라 앱을 실행시켜서 사진을 찍고, 데이터에 추가로 저장하고 사용해보도록 한다. 사진을 어디에 저장하고 저장된 사진을 어떻게 보여주어야 할지도 본문에서 알아보도록 한다.
안드로이드에서는 인텐트 intent 를 사용해 장치의 다른 앱에 있는 액티비티를 시작시킬 수 있다. 명시적 인텐트 explicit intent 에서는 시작시킬 액티비티 클래스를 지정하면 안드로이드 운영체제가 해당 액티비티를 시작시킨다. 반면에 암시적 인텐트 implicit intent 에서는 해야 할 작업을 알려주면 안드로이드 운영체제가 이 작업을 수행하는 데 적합한 앱의 액티비티를 찾아서 시작시킨다.
본문에서는 ① 암시적 인텐트를 사용해서 사용자의 연락처에서 범죄 용의자를 한 명 선택하고, ② 텍스트 형태의 범죄 보고서를 전송할 수 있게 한다. 이때 사용자는 장치에 설치된 연락처 앱과 텍스트 전송 앱을 선택해 사용할 수 있다.
잘 디자인된 안드로이드 앱에서 중요한 컴포넌트 중 하나가 앱 바 app bar 다. 앱 바는 사용자가 수행할 수 있는 액션과 화면 간을 이동할 수 있는 매커니즘을 제공한다. 더불어 디자인의 일관성도 제공한다.
앱 바는 액션 바 action bar 또는 툴바 toolbar 자세한 내용은 앱 바 vs 액션 바 vs 툴바 에서 다룬다.