Android
-
Android) 음성 녹음을 위한 MediaRecorder 알아보기Android 2021. 4. 12. 21:17
진행하는 프로젝트에서 음성 녹음 기능이 필요로 해서 Media Recorder에 대해 알아보려 합니다. Android에서 제공하는 기본 Recording API에는 Audio Recorder와 Media Recorder가 있는데, Audio Recorder의 경우 오디오만 녹음 가능하지만, Media Recorder는 오디오 및 비디오 녹음이 가능하다고 합니다. 하지만 Media Recorder의 경우 인코딩 된 파일을 받기 때문에 Audio Recorder처럼 PCM Data를 바로 받아올 수 없는 단점이 있습니다. Media Recorder Media Recorder는 아래와 같은 state machine을 가지고 있습니다. 그렇기 때문에 해당 state를 잘 이해하고 코드를 짜야 state가 꼬이지..
-
Android) Retrofit2 작동 원리 알아보기Android 2021. 4. 9. 15:12
대부분의 안드로이드 개발자는 통신 라이브러리로 Retrofit을 사용하고 있습니다. 오늘은 Retrofit의 특징 및 내부 작동방식에 대해 이해해보려고 합니다. Retrofit REST API 통신을 위해 구현된 통신 라이브러리. AsyncTask 없이 Background Thread에서 실행되면 callback을 통해 Main Thread에서 UI 업데이트를 간단하게 할 수 있도록 제공. 다른 통신 라이브러리도 존재하지만 Retrofit의 성능과 구현 방법이 쉽다. 속도에 대한 내용은 참조 Retrofit을 사용하기 위한 3가지 과정 1. JSON 형식에 따른 POJO 클래스 만들기. 클라이언트에서 서버에 request를 보내면 서버에서 JSON response를 줍니다. 해당 JSON 형식을 안드로이..
-
Android) Device 실제 사이즈 구하기 (feat - display, getRealMetrics)Android 2021. 4. 8. 17:43
Good bye defaultDisplay, getMetrics 화면에서 BottomSheetDialog를 띄울 때 디바이스 화면의 해상도와 높이를 구해서 코드를 적용했는데 아래와 같은 결과가 나왔습니다. val displayMetrics = DisplayMetrics() activity.windowManager.defaultDisplay.getMetrics(displayMetrics) val deviceHeight: Int = displayMetrics.heightPixels val layoutParams = view?.layoutParams layoutParams?.height = deviceHeight - 24.toPx() view?.layoutParams = layoutParams defaultD..
-
Android) State 패턴을 통해서 UI 상태 관리하기Android 2021. 2. 26. 12:19
오늘은 제가 요즘 유용하게 사용하고 있는 State 패턴에 대해서 글을 작성해보려고 합니다. State 패턴 객체의 특정 상태를 클래스로 선언하고, 클래스에서는 해당 상태에서 할 수 있는 행위들을 메서드로 정의합니다. 각 상태 클래스들을 캡슐화하여, 클라이언트에서 호출하는 방식 UI 상태관리를 Readable하게 하기 위한 방법 중 하나 이런 특징들로 회사에 출근하기 위한 State 패턴을 예로 만들어보자면 아래와 같은 상태로 나눌 수 있지 않을까 싶습니다. 각 상황에 따라 대처할 행위를 명시해 두는 것이죠. 그래면 해당 상황에 직면했을 때 대비하는 것이 쉬워집니다. when (상태) { is 출근.준비 -> { 씻기() 밥먹기() } is 출근.실패 -> { 늦잠() 회사에연락() } is 출근.성공 ..
-
Android) Room에서 List 또는 객체를 필드에 저장하는법 feat) @Embeded @TypeConverterAndroid 2021. 2. 19. 15:43
안드로이드를 개발하면서 로컬 데이터베이스인 Room을 자주 사용하는데, 컬럼에 List나 객체를 저장하려고 하면 에러가 발생합니다. Room은 primitive 타입(short, int, long, float, double, byte, char, boolean)과 그 wrapping 타입(primitve 타입을 객체로 한번 감싼 클래스)만 지원합니다. Room에서 객체 참조를 허용하지 않는 이유 클라이언트 측에서는 이 유형의 지연 로드가 일반적으로 UI 스레드에서 발생하기 때문에 실행 가능하지 않으며 UI 스레드에서 디스크에 관한 정보를 쿼리하면 상당한 성능 문제와 메모리 문제가 발생하기 때문입니다. 그럼 어떻게 해야 할까요? @Embeded 사용하여 테이블 내의 하위 필드로 분해하여 사용하기 @Type..
-
Android) asStateFlow() 메소드 알아보기Android 2021. 2. 17. 13:10
저는 요즘 StateFlow를 사용해서 UI 상태 관리 코드를 작성하고 있습니다. ViewModel private val _uiState = MutableStateFlow(State.empty()) val uiState: StateFlow get() = _uiState 어디서 많이 보던 코드 같죠? LiveData를 사용할때 처럼 backing property(외부에서 변경 못하게하고 내부에서 변경이 가능)를 선언하는 방법과 굉장히 유사합니다. 단지 StateFlow는 초기값이 필요하다는 점이 다른 것 같군요. 어쨌든 이런식으로 코드를 작성하고 있었는데, asStateFlow()라는 메소드를 알게 되었습니다. asStateFlow()의 내부는 아래와 같습니다. /** * Represents this mu..
-
Android) Jetpack Paging 3 라이브러리 알아보기Android 2021. 2. 16. 23:56
Paging Paging이란 데이터를 일정한 덩어리로 나눠서 제공하는 것을 의미. 즉 모든 데이터를 가져오는 것이 아닌 한 번에 작은 데이터 덩어리만 가져오는 것입니다. 사용자가 목록 끝에 도달하면 앱에서 더 많은 데이터를 로드합니다. 예를들어 구글에서 어떤 키워드를 검색하는 경우, 검색어에 해당하는 모든 데이터를 화면에 제공하는 것이 아니라 한 페이지당 10개의 데이터씩 데이터를 제공하는 것입니다. 그렇게 되면 성능, 메모리, 비용 면에서 효율적으로 이용할 수 있습니다. Paging3 Library Paging 3 라이브러리는 이전 버전들과 달라진 점들이 있다고 합니다. 그 새로운 기능 중 일부는 다음과 같습니다. Paging3 라이브러리는 다양한 데이터 소스에서 대량의 data set를 효율적으로 관..
-
Android) Airbnb에서 만든 MvRx 알아보기Android 2021. 2. 15. 15:48
이전 글에 작성했던 Epoxy를 통해 구글 알고리즘이 MvRx란 것에 저를 도달하게 하여.. 포스팅해보려고 합니다. 아직 버그 및 이슈들로 불안정한 코드들이긴 하나 Airbnb의 지속적인 지원으로 언젠가 Stable 해지지 않을까 싶습니다. MvRx에 관한 자세한 내용은 공식 문서 참고 바랍니다. MvRx MvRx (mavericks로 발음)는 Airbnb의 거의 모든 제품 개발에 사용하는 Airbnb의 Android 프레임 워크입니다. MvRx는 다음과 같은 기존 기술과 개념을 기반으로 구축되었습니다. Kotlin Android Architecture Components RxJava React (conceptually) Epoxy (optional) Core Concepts State MvRxState..