본문 바로가기
[android] AudioFocus 관리하기 - 2개 이상의 앱이 audio 를 하나의 stream 으로 동시에 재생할 수 있다. 시스템은 이들을 믹스한다. 이는 유저에게 소음이 될 수 있다. 이를 예방하기 위해서 "Audio Focus" 라는 개념을 도입했고, 하나의 앱만 audio focus 를 가질 수 있다. - 앱이 audio output 을 하려면, audio focus 를 요청해야 한다. focus 를 획득하면 소리를 재생할 수 있다. audio focus 를 획득한 후에 재생을 끝마칠 때까지 focus 를 유지하지 못 할 수 있다. 다른 앱이 focus 를 요청하여 취득하는 경우가 그 경우이다. Focus 를 잃으면 재생을 중단하거나, 볼륨을 줄이는 작업 등을 통해 유저가 새로운 audio 를 잘 들을 수 있게 협조해야 한다. - An.. 2022. 2. 14.
[kotlin] CoroutineContext 에 대한 이해 - Kotlin coroutine 의 핵심은 CoroutieContext interface 이다. 모든 launch, async 같은 coroutine builder 는 첫번째 param 으로 CoroutineContext 를 받는다. 이 coroutine builder 들은 CoroutineScope interface 의 extension function 으로 정의되어 있으며, abstract read-only property 로 coroutineContext 를 가지고 있다. - fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT,.. 2022. 2. 3.
[Android] Kotlin and Flow usage # Flow 는 'emit' 으로 data 를 발행하고, 'collect' 로 data 를 받아본다. # DataStore, Retrofit, Room, WorkManager 등에서 Flow 를 지원하고 있다. # flow builder 로 flow 를 쉽게 만들 수 있으며 이 녀석은 suspend block 을 받는다. # collect 역시 suspend block 을 받는다. # final operator 가 지정되기 전까지 flow 는 emit 하지 않으며, downstream 순서대로 로직이 수행된다. # Android UI 에서 collect 를 사용하기 위해서는 아래와 같은 방법이 사용된다. Flow.asLiveData():LiveData // 아래 2개를 추천함 Lifecycle.repea.. 2022. 1. 31.
[Dagger] Assisted Injection # Assisted injection 은 object 를 만들 때 몇몇 param 은 DI framework (Dagger 등) 로부터 주입받고, 나머지는 user 에 의해 creation time 에 제공받는 것을 이야기한다. Factory 가 이 param 들을 조합해서 object 를 생성한다. Dagger assisted injection # Dagger 의 assisted injection 을 사용하려면, constructor 에 @AssistedInject 를 마킹하고, assisted param 들에 대해 @Assisted 를 마킹해줘야 한다. class MyDataService @AssistedInject constructor( dataFetcher: DataFetcher, @Assiste.. 2022. 1. 28.
[Hilt] Entry Points What is an entry point? # Dagger 가 제공하는 objects 를 Dagger 의 inject 를 지원하지 않는 부분에서 접근하는 경계선이다. Dagger 의 object graph 에 접근하는 방법이라고 말할 수도 있다. When do you need an entry point? # non-Dagger lib 이나 Hilt 에 의해 지원되지 않는 android component 등에서 특정 dagger object 에 접근할 때 사용된다. How to use an entry point? # entry point 를 만들기 위해서는 binding 하고 싶은 type 에 대한 accessor method 를 interface 로 정의하고, @EntryPoint 와 @InstallIn.. 2022. 1. 27.
[android] DI with Hilt - Hilt 에 대해 알아보자 Dependency 추가 - build.gradle 에 hilt-android-gradle-plugin 을 추가하자. buildscript { ... ext.hilt_version = '2.35' dependencies { ... classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" } } - app/build.gradle 에 plugin 과 dependency 추가하자. plugins { kotlin("kapt") id("dagger.hilt.android.plugin") } android { ... } dependencies { implementation("com.google.dagger:hilt-android:$hilt_ver.. 2022. 1. 26.
[android] Overview - Hilt 에 대해 알아보자 - DI 는 다음과 같은 장점을 제공한다. 1. 코드 재활용 2. 쉬운 리팩토링 3. 쉬운 테스트 DI 핵심 * DI 는 무엇인가? - 클래스들은 다른 클래스들을 참조하곤 한다. 예를 들어 Car 는 Engine 을 참조할 수 있다. Engine 과 같이 참조되는 클래스들을 'dependencies' 라고 부른다. - 필요로 하는 class 를 갖는 3가지 방법이 있다. 1. dependency 를 직접 만든다. 예를 들어 Car 가 Engine 을 직접 만든다. 2. 다른 곳에서 얻어온다. 안드로이드에서 Context 를 얻어오는 것이나 getSystemService API 를 호출하는 것을 생각하면 된다. 3. param 으로 전달받는다. 앱은 이 dependencies 를 제공할 수 있다. 예를 들.. 2022. 1. 25.
[android] 안전하게 flow 를 collect 하기! - android 에서는 보통 UI layer 에서 flow 가 collect 된다. LifecycleOwner.addRepeatingJob, Lifecycle.repeatOnLifecycle, Flow.flowWithLifecycle 등을 이용해서 쓸데없이 res 가 낭비되지 않도록 하는 방법에 대해 알아본다. 리소스 낭비 - CoroutineScope.launch, Flow.launchIn, LifecycleCoroutineScope.launchWhenX 를 사용하는 것은 Activity 가 bg 로 들어갈 때 Job 을 수동으로 취소해주지 않는 한 안전한 방법이 아니다. 위 API 들은 app 이 bg 상태에 있을 때도 flow producer 가 buffer 에 emit 을 하도록 하고, 따라서 .. 2021. 5. 11.
[android] LiveData 를 StateFlow or SharedFlow 로 교체하기 (StateFlow 와 SharedFlow 도 이해해보기) - Kotlin Coroutine 은 최근 SharedFlow 와 StateFlow 라는 2가지 type 의 Flow 를 소개했다. - LiveData 를 Flow 형태로 바꾸기 전에 LiveData 를 Flow 형태로 바꾸어야 하는 이유를 알아보자. 1. LiveData 는 UI 에 너무 bind 되어 있다. 2. LiveData 는 Android platform 에 너무 bind 되어 있다. 위의 이유로 LiveData 는 Presentation Layer 에서는 사용하기 괜찮을 수 있지만, Domain Layer 로 내려가기에는 ugly 해진다. Domain Layer 는 platform-independent 해야 하기 때문이다. - LiveData 를 pure Flow 로 교체할 수는 없다. 1... 2021. 5. 9.
반응형