Невозможно установить пользовательскую фабрику рабочих в WorkManager
Я использую этот код для установки собственной фабрики рабочих:
val daggerWorkerFactory = DaggerWorkerFactory(toInjectInWorker)
val configuration = Configuration.Builder()
.setWorkerFactory(daggerWorkerFactory)
.build()
WorkManager.initialize(context, configuration)
После выполнения этого кода я могу получить экземпляр WorkManager:
val workManager = WorkManager.getInstance()
Проблема в том, что для каждого работника, созданного после этого момента, моя фабрика никогда не используется. Вместо этого используется фабрика по умолчанию.
В документации API я вижу, что метод WorkManager.initialize имеет примечание:
Отключите androidx.work.impl.WorkManagerInitializer в своем манифесте
Я не могу найти информацию о том, как это сделать. Это было на некоторых старых версиях WorkManager, и они забыли удалить из документации, или это действительно необходимо? Если так, то как?
1 ответ
Из документации WorkerManager.initialize()
По умолчанию этот метод не должен вызываться, потому что
WorkManager
автоматически инициализируется. ИнициализироватьWorkManager
самостоятельно, пожалуйста, выполните следующие действия:запрещать
androidx.work.impl.WorkManagerInitializer
в вашем манифестеApplication#onCreate
илиContentProvider
вызовите этот метод перед вызовомgetInstance()
Так что вам нужно отключить WorkManagerInitializer
в вашем файле манифеста:
<application
//...
android:name=".MyApplication">
//...
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="your-packagename.workmanager-init"
android:enabled="false"
android:exported="false" />
</application>
И в вашем обычае Application
класс, инициализировать ваш WorkerManager
:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
val daggerWorkerFactory = DaggerWorkerFactory(toInjectInWorker)
val configuration = Configuration.Builder()
.setWorkerFactory(daggerWorkerFactory)
.build()
WorkManager.initialize(context, configuration)
}
}
Замечания:
По умолчанию, WorkerManager
добавит ContentProvider
называется WorkerManagerInitializer
с властями, установленными на my-packagename.workermanager-init
,
Если вы неправильно указали права доступа в файле манифеста при отключении WorkerManagerInitializer
Android не сможет скомпилировать ваш манифест.