Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android WorkManager:如何在同一个应用程序中设置不同的WorkManager配置_Android_Dagger 2_Android Workmanager - Fatal编程技术网

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

Android WorkManager:如何在同一个应用程序中设置不同的WorkManager配置,android,dagger-2,android-workmanager,Android,Dagger 2,Android Workmanager,我正在从事一个多模块项目(Gradle模块)。我正在模块中使用WorkManager。我也在使用匕首进行依赖注入。 现在我必须使用dagger将依赖项注入到我的WorkManager。我非常熟悉WorkManager的Dagger 2设置。但我面临的问题是,我必须使用 工人工厂,使其与匕首兼容。因此,我可以借助Dagger多绑定注入依赖项。但当前主模块(主应用程序gradle模块)中的WorkManager配置为 它不使用自定义工厂。并且已经有几个其他模块(用于其他功能的gradle模块)在没有

我正在从事一个多模块项目(Gradle模块)。我正在模块中使用WorkManager。我也在使用匕首进行依赖注入。 现在我必须使用dagger将依赖项注入到我的WorkManager。我非常熟悉WorkManager的Dagger 2设置。但我面临的问题是,我必须使用 工人工厂,使其与匕首兼容。因此,我可以借助Dagger多绑定注入依赖项。但当前主模块(主应用程序gradle模块)中的WorkManager配置为

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

您可以使用,并且您可以自定义WorkerFactory

您的自定义WorkerFactory将需要检查传递给工厂的类名是否是它要处理的类名,如果不是,只需返回
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
        }
    }
}