Android 使用“WorkContinuation.combine()”时在使用dagger2初始化WorkManger时出现问题
我一直在使用workManager,它与dagger2配合得很好,但当我使用Android 使用“WorkContinuation.combine()”时在使用dagger2初始化WorkManger时出现问题,android,kotlin,dagger-2,android-architecture-components,android-workmanager,Android,Kotlin,Dagger 2,Android Architecture Components,Android Workmanager,我一直在使用workManager,它与dagger2配合得很好,但当我使用WorkContinuation.combine()进行链接时,WorkerFactory出现了一个问题 我的工人没有草签 坠机报告是 java.lang.IllegalArgumentException: unknown worker class name: androidx.work.impl.workers.CombineContinuationsWorker at incubasys.aydo.r
WorkContinuation.combine()
进行链接时,WorkerFactory出现了一个问题
我的工人没有草签
坠机报告是
java.lang.IllegalArgumentException: unknown worker class name: androidx.work.impl.workers.CombineContinuationsWorker
at incubasys.aydo.repositories.worker.WorkerFactory.createWorker(WorkerFactory.kt:22)
at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:81)
at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:228)
at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:127)
at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:75)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
发生碰撞的WorkerFactory
class DaggerWorkerFactory @Inject constructor(
private val workerFactories: Map<Class<out ListenableWorker>, @JvmSuppressWildcards Provider<ChildWorkerFactory>>
) : WorkerFactory() {
override fun createWorker(
appContext: Context,
workerClassName: String,
workerParameters: WorkerParameters
): ListenableWorker? {
val foundEntry =
workerFactories.entries.find { Class.forName(workerClassName).isAssignableFrom(it.key) }
//crashes here
val factoryProvider = foundEntry?.value
?: throw IllegalArgumentException("unknown worker class name: $workerClassName")
return factoryProvider.get().create(appContext, workerParameters)
}
}
class DaggerWorkerFactory@Inject构造函数(
私有val WorkerFactorys:映射
):WorkerFactory(){
覆盖有趣的createWorker(
appContext:Context,
workerClassName:String,
workerParameters:workerParameters
):ListenableWorker{
val foundEntry=
WorkerFactorys.entries.find{Class.forName(workerClassName).isAssignableFrom(it.key)}
//在这里撞车
val factoryProvider=foundEntry?.value
?:抛出IllegalArgumentException(“未知工作者类名:$workerClassName”)
返回factoryProvider.get().create(appContext,workerParameters)
}
}
仅当我使用
workcontinuations.combine()
WorkContinuation.combine()
将CombineContinuationsWorker
类的实例添加到您的continuation中时,它才会崩溃。这意味着您的WorkerFactory在创建实际的worker类时需要处理此类名称 您有两个选择:
CombineContinuationsWorker
处理到您的workerFactorynull
。
然后,delegatingWorkerFactory
将使用默认的workerFactory来实例化正确的类就我个人而言,我更喜欢第二个选项,因为它可以处理WorkManager中的任何更改,并且您可以潜在地添加更多/不同的工人工厂来处理应用程序的不同部分/模块。您应该从
WorkerFactory
返回null
以委托给默认的WorkerFactory
您不需要
DelegatingWorkerFactory
可以发布用于调用WorkContinuation.combine()
的代码吗?谢谢。。我意识到,经过一些研究,我删除了throw IllegalArgumentException(“未知工作者类名:$workerClassName”)
由于createWorker
方法重新运行nullable
ListenableWorker
,因此CombineContinuationWorker
的实例不再由我的工厂处理。。而且很有效。。