Android WorkManager:如何在同一个应用程序中设置不同的WorkManager配置
我正在从事一个多模块项目(Gradle模块)。我正在模块中使用WorkManager。我也在使用匕首进行依赖注入。 现在我必须使用dagger将依赖项注入到我的WorkManager。我非常熟悉WorkManager的Dagger 2设置。但我面临的问题是,我必须使用 工人工厂,使其与匕首兼容。因此,我可以借助Dagger多绑定注入依赖项。但当前主模块(主应用程序gradle模块)中的WorkManager配置为 它不使用自定义工厂。并且已经有几个其他模块(用于其他功能的gradle模块)在没有工厂的情况下使用WorkManger。现在,如果我更改此配置并添加工厂,它可能会破坏其他几个地方的work manager设置。我可以仅对模块中的WorkManager类使用工厂(或者只有一些WorkManager类应通过工厂初始化,其他类使用默认配置)。有可能吗?希望我的问题很清楚 您可以使用,并且您可以自定义WorkerFactory 您的自定义WorkerFactory将需要检查传递给工厂的类名是否是它要处理的类名,如果不是,只需返回Android WorkManager:如何在同一个应用程序中设置不同的WorkManager配置,android,dagger-2,android-workmanager,Android,Dagger 2,Android Workmanager,我正在从事一个多模块项目(Gradle模块)。我正在模块中使用WorkManager。我也在使用匕首进行依赖注入。 现在我必须使用dagger将依赖项注入到我的WorkManager。我非常熟悉WorkManager的Dagger 2设置。但我面临的问题是,我必须使用 工人工厂,使其与匕首兼容。因此,我可以借助Dagger多绑定注入依赖项。但当前主模块(主应用程序gradle模块)中的WorkManager配置为 它不使用自定义工厂。并且已经有几个其他模块(用于其他功能的gradle模块)在没有
null
,并且DelegatingWorkerFactory
将使用反射还原为默认的工人工厂
请记住,每次初始化WorkManager时都需要添加自定义WorkerFactory。如果您不这样做,并且WorkManager尝试为您的工作人员填写一个工作请求(通常由自定义WorkerFactory处理),它将退回到默认WorkerFactory并失败(可能有一个找不到类的异常)
我们正在使用中的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
}
}
}
我们可以为动态功能模块做些什么,我们可能希望从功能模块注册一个工人工厂?你的答案可能对人们有用,但没有回答标题:我们仍然只有一个配置我刚刚尝试使用反射来获取工人工厂的类,但在主模块启动时,似乎无法访问动态功能模块类:当应用程序中首次调用
getWorkManagerConfiguration
时。WorkManager是单例,您只能有一个配置。您可以做的是动态地将WorkerFactory注册到一个“mainModuleWorkerFactory”(过去我们在Plaid中做过类似的事情,但从未合并,因为我们用于该功能的后端不再可用)。如果卸载了DFM,您还需要记住删除所有计划的工作请求。谢谢您的回复。但是,如果WorkManager没有在onCreate(如文档所示)中注册,我不确定它是否能够找到工人工厂?WorkManager还会尝试使用有限的工厂吗?不过我明白你的意思:在DataModule中获取MainWorkManagerFactory,并从动态功能模块中添加一个新工厂,最后是factory.addFactory(UpvoteStoryWorkerFactory(service))
不确定它是否适用于动态功能模块(apk中的不同文件结构?),当WorkManager启动应用程序执行某些工作时
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
}
}
}