Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 使用“WorkContinuation.combine()”时在使用dagger2初始化WorkManger时出现问题_Android_Kotlin_Dagger 2_Android Architecture Components_Android Workmanager - Fatal编程技术网

Android 使用“WorkContinuation.combine()”时在使用dagger2初始化WorkManger时出现问题

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

我一直在使用workManager,它与dagger2配合得很好,但当我使用
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
    处理到您的workerFactory
  • 使用并将工厂添加到中,以便在找不到正确的类名时返回
    null
    。 然后,
    delegatingWorkerFactory
    将使用默认的workerFactory来实例化正确的类

  • 就我个人而言,我更喜欢第二个选项,因为它可以处理WorkManager中的任何更改,并且您可以潜在地添加更多/不同的工人工厂来处理应用程序的不同部分/模块。

    您应该从
    WorkerFactory
    返回
    null
    以委托给默认的
    WorkerFactory


    您不需要
    DelegatingWorkerFactory

    可以发布用于调用
    WorkContinuation.combine()
    的代码吗?谢谢。。我意识到,经过一些研究,我删除了
    throw IllegalArgumentException(“未知工作者类名:$workerClassName”)
    由于
    createWorker
    方法重新运行
    nullable
    ListenableWorker
    ,因此
    CombineContinuationWorker
    的实例不再由我的工厂处理。。而且很有效。。