WorkManager에 Hilt로 의존성 주입하기
안드로이드 Sunflower 코드를 뜯어보며 공부하던 중, Room에 초기 데이터를 채워주기 위해 사용하는 WorkManager를 사용하는데에 문제가 있었다.
Sunflower에서는 Room DB를 생성한 후, 필요한 곳에서 instance를 호출하여 사용하는 구조였으나, 본인은 의존성을 주입할 때 Singleton으로 생성하여 주입하는 식으로 코드를 작성하였기 때문에, WorkManager 내부에서 Room DB를 사용하기 위해선 주입을 받아 사용해야했다.
그러나 일반적으로 WorkManager는 기존에 제공하는 패러미터를 제외하고는 사용할 수 없다. 추가로 패러미터를 넣을 경우 다음과 같은 에러가 호출된다.
java.lang.NoSuchMethodException: com.seoplee.sunflower_study_seoplee.workers.SeedDatabaseWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters]
WorkManager에 Hilt를 이용하여 의존성을 주입하기 위해서는 몇가지 추가해주어야 한다.
참고: https://developer.android.com/training/dependency-injection/hilt-jetpack
우선 hilt를 위한 의존성을 추가한다.
implementation "androidx.hilt:hilt-work:1.0.0"
kapt "androidx.hilt:hilt-compiler:1.0.0"
Application 클래스에 Configuration.Provider 인터페이스를 구현 후, HiltWorkFactory 인스턴스를 전달한다.
@HiltAndroidApp
class MyApplication : Application(), Configuration.Provider {
@Inject
lateinit var workerFactory: HiltWorkerFactory
init {
appContext = this
}
override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
companion object {
var appContext: Context? = null
private set
}
}
어노테이션으로 @HiltWorker를 사용하며, 기존의 WorkManager의 패러미터는 @Assisted 어노테이션으로 구분하여 사용한다.
@HiltWorker
class SeedDatabaseWorker @AssistedInject constructor (
@Assisted context: Context,
@Assisted workerParams: WorkerParameters,
private val db : AppDataBase
)
또한 새로운 패러미터를 추가하게 되면, 기존의 WorkManager가 제공하는 기본 초기화를 수행하지 않게끔 AndroidManifest 파일에 다음과 같이 추가한다.
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove" />
Reference: https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration
'Android > Architecture' 카테고리의 다른 글
Hilt의 다양한 어노테이션 - @Provides, @Binds, @Qualifier (0) | 2022.05.04 |
---|---|
Android MVVM + DI(Hilt) 적용하기 (0) | 2022.03.21 |
DataBinding vs ViewBinding (0) | 2021.11.20 |
Android - State Pattern (0) | 2021.11.13 |
Android - TDD 셋업하기 (Unit Test) (0) | 2021.10.13 |