WorkManager: Как настроить различные конфигурации WorkManager в одном приложении - PullRequest
1 голос
/ 28 января 2020

Я работаю над многомодульным проектом (модуль Gradle). Я использую WorkManager в моем модуле. Я также использую Dagger для внедрения зависимостей. Теперь я должен использовать кинжал для внедрения зависимостей в мой WorkManager. Я хорошо знаком с настройкой Dagger 2 с помощью WorkManager. Но проблема, с которой я сталкиваюсь, заключается в том, что я должен использовать фабрику рабочих, чтобы сделать ее совместимой с кинжалом. Так что я могу вводить зависимости с помощью привязок Dagger Multi. Но в настоящее время конфигурация WorkManager в главном модуле (модуль Gradle основного приложения) имеет значение

      public Configuration getWorkManagerConfiguration() {
        return new Configuration.Builder()
            .setMinimumLoggingLevel(android.util.Log.INFO)
            .build();
      }

, которое не использует собственную фабрику. И уже несколько других модулей (модули gradle для других функций) используют WorkManger без заводских настроек. Теперь, если я изменю эту конфигурацию и добавлю фабрику, это может нарушить настройку менеджера работ в нескольких других местах. Могу ли я использовать фабрику только для классов WorkManager в моем модуле (или только некоторые классы менеджера работ должны быть инициализированы через фабрику, другие используют конфигурацию по умолчанию). Возможно ли это сделать? Надеюсь, моя проблема ясна.

1 Ответ

1 голос
/ 28 января 2020

Вы можете использовать DelegatingWorkerFactory и добавить свой пользовательский WorkerFactory к нему.

Ваш пользовательский WorkerFactory должен будет проверить, передано ли имя класса в фабрика - это та, которую он хочет обработать, если нет, просто верните null, и DelegatingWorkerFactory вернется к фабрике рабочих по умолчанию, используя отражение.

Имейте в виду, что вам нужно добавить свой собственный WorkerFactory каждый раз, когда вы инициализируете WorkManager. Если вы этого не сделаете, и WorkManager попытается выполнить WorkRequest для вашего Worker (который обычно обрабатывается пользовательским WorkerFactory), он вернется к стандартному WorkerFactory и завершится ошибкой (вероятно, с исключением класса not found).

Мы используем DelegatingWorkerFactory in IOsched , приложение для планирования, используемое для ввода-вывода, и Android Developer Summit. Код вашего пользовательского WorkerFactory будет выглядеть примерно так:

class ConferenceDataWorkerFactory(
    private val refreshEventDataUseCase: RefreshConferenceDataUseCase
) : WorkerFactory() {

    override fun createWorker(
        appContext: Context,
        workerClassName: String,
        workerParameters: WorkerParameters
    ): ListenableWorker? {

        return when (workerClassName) {
            ConferenceDataWorker::class.java.name ->
                ConferenceDataWorker(appContext, workerParameters, refreshEventDataUseCase)
            else ->
                // Return null, so that the base class can delegate to the default WorkerFactory.
                null
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...