Dagger - Hilt 에 이어서 Hilt에서 워크 매니저에게 주입하는 법을 알아보려 한다.
방법은 간단한데, 굳이 작성한 이유는 "E/WM-WorkerWrapper: Could not create Worker" 에러 때문이다.
시작하기
implementation 'androidx.hilt:hilt-work:1.0.0-alpha01'
워크 매니저를 힐트와 함께 사용하려면 위의 라이브러리를 추가해야 한다.
WorkFactory 설정하기
@HiltAndroidApp
class UsageApplication : Application(), Configuration.Provider {
@Inject
lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
HiltWorkerFactory
라는 힐트에서의 워커 팩토리가 만들어져 있다.
위의 팩토리를 통해 생성해야지만 원하는 대로 주입이 가능하다.
Configuration.Provider
를 상속받아서 getWorkManagerConfiguration
함수를 위처럼 구현해준다.
WorkManager 가 HiltWorkerFactory
를 통해서 Worker 들을 생성하게 하기 위해서이다.
Worker 만들기
class SampleWorker @WorkerInject constructor(
@Assisted context: Context,
@Assisted workerParameters: WorkerParameters,
private var repository: SampleRepository
) : Worker(context, workerParameters) {
override fun doWork(): Result {
...
}
}
@WorkerInject
를 생성자에 붙이고, @Assisted
를 위에 처럼 붙여주면 된다.
그리고 주입할 대상을 추가해주면 된다.
원래라면 context, workerParameters 이외의 인자를 받으려면 WorkerFactory를 상속받아 구현한 뒤 설정해주는 작업이 필요한데,
해당 작업을 HiltWorkerFactory
가 대신해주었기에 신경 쓸 필요가 없다.
Google Developer 사이트에 나오는 건 여기까지이다.
그래서 "E/WM-WorkerWrapper: Could not create Worker" 에러가 나온다.
"E/WM-WorkerWrapper: Could not create Worker" 에러 처리
<application
...
>
...
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove"
android:exported="false" />
</application>
워커 매니저에 커스텀한 팩토리를 제공하려면 기본 제공자가 동작하지 못하도록 막아야 한다.
그렇기에 AndroidManifest.xml 에 가서 위의 코드로 동작을 막아 주어야 한다.
( WorkManager 가이드에는 이 내용이 있는데, Hilt 에는 없어서 한참 헤맸다.. )
'안드로이드' 카테고리의 다른 글
Espresso intents - 카메라 촬영 테스트 하기 (0) | 2020.07.17 |
---|---|
Android - java.time 패키지 (0) | 2020.07.15 |
Android & Java - Reflection (0) | 2020.07.02 |
Android & Java - Dynamic Proxy (0) | 2020.06.30 |
Android Espresso #4 - ActivityRules (0) | 2020.06.29 |