본문 바로가기

안드로이드

Android Hilt - WorkManager

반응형

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