【问题标题】:App keeps crashing while initialising Worker with Dagger2 in Android 6.0在 Android 6.0 中使用 Dagger2 初始化 Worker 时应用程序不断崩溃
【发布时间】:2020-05-14 08:15:33
【问题描述】:

java.lang.ClassCastException: androidx.work.impl.workers.ConstraintTrackingWorker 无法转换为 androidx.work.Worker 在 java.lang.Class.asSubclass(Class.java:1486) 在 com.mpower.android.lpincrm.workers.DaggerWorkerFactory.createWorker(DaggerWorkerFactory.kt:38) 在 androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:83) 在 androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:242) 在 androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:136) 在 androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 在 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】:

    您的WorkerFactory 错误地假定应用程序创建的每个ListenableWorker 子类也是Worker 子类。事实证明,WorkManager 库包含该规则的一些例外情况,用作内部实现细节。

    解决方法是将传递的工人类视为ListenableWorker 的子类,而不是Worker

    val workerclass = Class.forName(workerClassName).asSubclass(ListenableWorker::class.java)
    

    【讨论】:

    • 虽然我的应用程序中使用的所有 ListenableWorker 类都仅扩展了 Worker 类,并且此错误发生在特定设备中(在其他设备中没有错误),但您的解决方案阻止了崩溃。谢谢。你能解释一下为什么其他设备没有发生这种情况吗?
    • @tahsinRupam 根据源代码中的 cmets,ConstraintTrackingWorker 用于 API 级别 23-25(Android 6.0 - 7.1),当约束包括 requiresBatteryNotLowrequiresStorageNotLow 时。在 Android 8 之前,这些约束在 JobScheduler 中不可用。
    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    相关资源
    最近更新 更多