WorkManager:如何在同一个 App 中设置不同的 WorkManager 配置

WorkManager : How to set-up different WorkManager Configurations in same App

我正在处理一个多模块项目(Gradle 模块)。我在我的模块中使用 WorkManager。我还使用 Dagger 进行依赖注入。 现在我必须使用 dagger 将依赖项注入我的 WorkManager。我非常熟悉使用 WorkManager 设置 Dagger 2。但我面临的问题是,我必须使用 工人工厂,使其与匕首兼容。这样我就可以在 Dagger Multi 绑定的帮助下注入依赖项。但目前主模块(Main app gradle 模块)中的 WorkManager 配置是

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

不使用自定义工厂。并且已经有几个其他模块(gradle 个用于其他功能的模块)正在使用没有工厂的 WorkManger。现在,如果我更改此配置并添加一个工厂,它可能会破坏其他几个地方的工作管理器设置。我可以只为模块中的 WorkManager 类 使用工厂吗(或者只有一些工作管理器 类 应该通过工厂初始化,其他使用默认配置)。有可能吗?希望我的问题很清楚。

您可以使用 DelegatingWorkerFactory and add 您自定义的 WorkerFactory。

您的自定义 WorkerFactory 将需要检查传递给工厂的 classname 是否是它想要处理的名称,如果不是,只需 return nullDelegatingWorkerFactory 将使用反射恢复到默认的工人工厂。

请记住,每次初始化 WorkManager 时都需要添加自定义 WorkerFactory。如果您不这样做,并且 WorkManager 尝试为您的 Worker 完成 WorkRequest(通常由自定义 WorkerFactory 处理),它将回退到默认 WorkerFactory 并失败(可能出现 class not found 异常)。

我们在 IOsched 中使用 DelegatingWorkerFactory,用于 I/O 和 Android 开发者峰会的日程安排应用程序。 您的自定义 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
        }
    }
}