WorkManager:如何在同一应用程序中设置不同的WorkManager配置

4

我正在进行一个多模块项目(Gradle模块)的开发。在我的模块中,我正在使用WorkManager。我还利用Dagger进行依赖注入。现在我需要使用dagger来为我的WorkManager注入依赖项。我对使用Dagger 2配置WorkManager很熟悉。但是我面临的问题是,我必须使用工作者工厂(Worker Factory)使其与Dagger兼容。这样我就可以借助Dagger Multi bindings实现依赖注入。但是目前主应用程序Gradle模块中的WorkManager配置如下:

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

这个问题涉及到 IT 技术,需要翻译的内容是:某些模块(其他功能的 Gradle 模块)在不使用自定义工厂的情况下已经在使用 WorkManager。如果我更改此配置并添加工厂,可能会破坏其他地方的工作管理器设置。我能否仅针对我的模块中的 WorkManager 类使用工厂(或仅应该通过工厂初始化某些工作管理器类,而其他则使用默认配置)。这样做有可能吗?希望我的问题清楚明了。

1个回答

3

您可以使用DelegatingWorkerFactory,并将add您的自定义WorkerFactory添加到其中。

您的自定义WorkerFactory需要检查传递给工厂的类名是否是它要处理的类名,如果不是,则只需返回nullDelegatingWorkerFactory将使用反射恢复默认的工作程序工厂。

请注意,每次初始化WorkManager时都需要添加您的自定义WorkerFactory。如果不这样做,并且WorkManager尝试满足您的Worker的WorkRequest(通常由自定义WorkerFactory处理),它将回退到默认的WorkerFactory并失败(可能会出现找不到类的异常)。

我们在 IOsched 中使用 DelegatingWorkerFactory,这是一个用于 I/O 和 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
        }
    }
}

对于动态特性模块,我们可以做些什么,例如我们可能想要从一个特性模块中注册一个工作器工厂?你的回答对人们可能有用,但并没有回答标题:我们仍然只有一个配置。 - Ben Butterworth
我刚刚尝试使用反射来获取工人工厂的类,但是似乎动态功能模块的类在主模块启动时无法访问:当首次在应用程序中调用getWorkManagerConfiguration时。 - Ben Butterworth
WorkManager是单例的,您只能拥有一个配置。您可以动态地将WorkerFactory注册到“mainModuleWorkerFactory”中(我们之前在Plaid中尝试过类似的操作 https://github.com/android/plaid/pull/682 ,但由于我们用于该功能的后端不再可用而未合并)。 如果您的DFM被卸载,还需要记得删除所有已计划的WorkRequest。 - pfmaggi
谢谢您的回复。但是,我不确定如果工厂未在onCreate中注册(如文档所述),WorkManager是否能够找到该工厂? WorkManager仍然会尝试使用有限的一组工厂吗? 我明白您的意思:在DataModule中获取MainWorkManagerFactory,并从动态功能模块添加一个新的工厂,最后factory.addFactory(UpvoteStoryWorkerFactory(service)) 不确定它是否适用于动态功能模块(apk中的不同文件结构?) - Ben Butterworth
当WorkManager启动应用程序执行一些任务时 - Ben Butterworth
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接