분류 전체보기
-
Android) Navigation을 사용해 startActivityForResult 구현하기Android 2021. 4. 21. 16:16
안드로이드에서 생성한 Activity로부터 결과를 받아서 호출한 Activity에서 사용하려면 startActivityForResult() 메소드를 사용해야 합니다. 새로 호출된 Activity에서 setResult()를 통해 돌려줄 결과를 저장하고 finish()로 Activity를 종료합니다. 이후 그 결과는 호출했던 Activity의 onActivityResult() 메소드를 통해 전달되게 됩니다. 그럼 Navigation 라이브러리를 사용하는 경우 어떻게 결과를 받아올 수 있을까요? 예를들어 위와 같은 nav_graph가 있습니다. 메인 화면(main_fragment)에서 프로필(profile_fragment) 화면으로 가기 위해서 로그인(login_fragment)을 통한 인증을 해야 이동할 수..
-
Android) Dagger Hilt - @ViewModelInject, @Assited, @ApplicationComponent is Deprecated(2.33-beta)Android 2021. 4. 18. 13:31
Dagger Hilt Dagger Hilt를 사용하여 의존성 주입을 할 때 다음과 같이 코드를 작성했습니다. // ViewModel class SkinViewModel @ViewModelInject constructor( private val skinRepository: SkinRepository, private val dispatchers: BaseProvider, @Assisted private val savedStateHandle: SavedStateHandle ) : ViewModel() { // Something() } // Module @Module @InstallIn(ActivityComponent::class) abstract class AnalyticsModule { @Binds abst..
-
Android) MediaPlayer 재생 지연 오류Android 2021. 4. 13. 17:22
어제 MediaRecorder에 관한 내용을 포스팅했었습니다. MediaRecorder를 이용해서 녹음을 완료했을 때, MediaPlayer를 이용해서 녹음 파일을 재생시키면 잠깐의 delay후에 재생이 되는 것을 확인할 수 있었습니다. 구글링을 열심히 해봤는데 제가 발견한 키워드는 SoundPool 그리고 MediaPlayer를 onCreate()가 아닌 onStart() 혹은 onResume()에서 재생해보는 것입니다. 특징을 조금 살펴보면 아래와 같다고 하네요. MediaPlayer는 상대적으로 음악과 같이 음원의 길이가 긴 것들을 한 번에 하나씩 재생하는데 용이한 구조 SoundPool은 반대로 게임의 효과음처럼 짧으면서 여러 개를 동시에 재생할 필요가 있는 것들을 다룰 때 유용 저는 1분까지의 ..
-
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..