WorkManager является одноэлементным, его необходимо настроить перед использованием, и вы не можете изменить его конфигурацию без перезапуска приложения.
Второй вызов инициализации вызывает исключение, указывающее, что он не может использовать эту конфигурацию, еслиWorkManager уже инициализирован.Это было дизайнерское решение, принятое во время первых альфа-версий, чтобы избежать молчания сбоев ( workmanager-1.0.0-alpha11 ).
WorkManager v2.1 добавляетспособ инициализации библиотеки по требованию, так что вы можете убрать фактическую инициализацию из последовательности горячего запуска вашего приложения.Однако у вас все еще есть ограничения, что WorkManager может быть настроен только один раз.
С новой конфигурацией по требованию вы должны добавить в приложение интерфейс Configuration.Provider
, как здесь:
class MyApplication : Application(), Configuration.Provider {
override fun getWorkManagerConfiguration(): Configuration =
// provide custom configuration
Configuration.Builder()
.setMinimumLoggingLevel(android.util.Log.INFO)
.setWorkerFactory(MyWorkerFactory())
.build()
}
Затем, когда вам нужно использовать WorkManager, вместо использования WorkManager#getInstance()
(который сейчас устарел), вы должны использовать новый:
WorkManager#getInstance(context)
В этом случае, метод getInstance, проверьте, еслиWorkManager уже инициализирован или нет.Если он еще не инициализирован, он получает конфигурацию с помощью метода getWorkManagerConfiguration()
, а затем инициализирует WorkManager.Таким образом, вы больше не звоните WorkManager#initialize()
, чтобы полностью избежать проблемы.
Официальная документация была обновлена с этими дополнительными деталями.
Если вы считаете,что WorkManager должен позволять обновлять свою конфигурацию после инициализации, вы должны добавить запрос функции в систему отслеживания проблем библиотеки .