【问题标题】:WorkManager : How to set-up different WorkManager Configurations in same AppWorkManager : 如何在同一个 App 中设置不同的 WorkManager 配置
【发布时间】:2020-01-28 05:00:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: android dagger-2 android-workmanager


    【解决方案1】:

    你可以使用 DelegatingWorkerFactoryadd 你自定义的 WorkerFactory。

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

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

    我们在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
            }
        }
    }
    

    【讨论】:

    • 我们可以为动态功能模块做什么,我们可能想从一个功能模块注册一个工人工厂?您的回答可能对人们有用,但没有回答标题:我们仍然只有 一个 配置
    • 我刚刚尝试使用反射来获取工人工厂的类,但看起来动态功能模块的类在主模块中启动时无法访问:当@987654330 @ 在应用程序中首先被调用。
    • WorkManager 是一个单例,你只能有一个单一的配置。您可以做的是将您的 WorkerFactory 动态注册到“mainModuleWorkerFactory”(过去我们曾考虑在 Plaid 中做类似的事情github.com/android/plaid/pull/682 从未合并,因为我们用于该功能的后端不再可用)。如果您的 DFM 已卸载,您还需要记住删除所有计划的 WorkRequest。
    • 感谢您的回复。但是,如果 WorkManager 没有在 onCreate 中注册(如文档所述),我不确定它是否能够找到工人工厂? WorkManager 仍会尝试使用有限的一组工厂吗?我明白你的意思:在 DataModule 中获取 MainWorkManagerFactory,并从动态功能模块添加一个新工厂,最后factory.addFactory(UpvoteStoryWorkerFactory(service)) 不确定它是否适用于动态功能模块(apk 中的不同文件结构?)
    • 具体来说,当 WorkManager 启动应用程序做一些工作时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2019-03-13
    • 2020-07-20
    • 1970-01-01
    • 2023-03-04
    • 2019-01-14
    相关资源
    最近更新 更多