在Android 6.0中用Dagger2初始化Worker时,应用程序一直崩溃。

问题描述 投票:0回答:1

java.lang.ClassCastException: androidx.work.impl.worker.ConstraintTrackingWorker cannot be cast to androidx.work.Worker at java.lang.Class.asSubclass(Class.java:1486) at com.mpower.android. lpincrm.workers.DaggerWorkerFactory.createWorker(DaggerWorkerFactory.kt:38) at androidx.work.WorkerFactory.createWorkerwithDefaultFallback(WorkerFactory.java:83) at androidx.work.impl.WorkerWrapper. runWorker(WorkerWrapper.java:242) at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:136) at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91) 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)

的第一行出现错误。createWorker():

override fun createWorker(appContext: Context, workerClassName: String, workerParameters: WorkerParameters): ListenableWorker? {
        val workerclass = Class.forName(workerClassName).asSubclass(Worker::class.java)
        val constructor = workerclass.getDeclaredConstructor(Context::class.java, WorkerParameters::class.java)
        val instance = constructor.newInstance(appContext, workerParameters)


    when (instance) {
        is MetaWorker -> {
            instance.treatmentMetaRepository = foo
            instance.newsRepository = foo1
            instance.geoDataRepository = foo2
            instance.medicineMetaRepository = foo3
            instance.preferenceUtil = preferenceUtil
        }
        is NotificationSchedulerWorker -> {
            instance.notificationRepository = notification
        }
        is SyncWorker -> {
            instance.syncAPIs = syncAPI
            instance.registrationAPI = registrationAPI
            instance.preferenceUtil = preferenceUtil
            instance.treatmentRepository = treatmentRepository
            instance.medicineRepository = medicineRepository
            instance.medicineDetailsRepository = medicineDetailsRepository
            instance.collectionRepository = collectionRepository
            instance.newVisitRepository = newVisitRepository
            instance.dueReceiptRepository = dueReceiptRepository
            instance.transportationRepository = transportationRepository  
        }
    }
    return instance
}

我的工人版本。

def work_version = "2.3.4"
implementation "androidx.work:work-runtime:$work_version"
android dagger-2 android-workmanager
1个回答
1
投票

你的 WorkerFactory 错误地认为,每一个 ListenableWorker 应用程序创建的子类也是一个 Worker 子类。 原来 WorkManager 库中包含了一些例外的规则,这些规则被用作内部实现细节。

修正的方法是将传递的worker类作为 ListenableWorker,不 Worker.

val workerclass = Class.forName(workerClassName).asSubclass(ListenableWorker::class.java)
© www.soinside.com 2019 - 2024. All rights reserved.