android - 在 Android 6.0 中使用 Dagger2 初始化 Worker 时应用程序不断崩溃
问题描述
java.lang.ClassCastException: androidx.work.impl.workers.ConstraintTrackingWorker 无法在 com.mpower.android.lpincrm.workers 的 java.lang.Class.asSubclass(Class.java:1486) 中转换为 androidx.work.Worker。 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"
解决方案
您WorkerFactory
错误地假设ListenableWorker
应用程序创建的每个子类也是一个Worker
子类。事实证明,该WorkManager
库包含此规则的一些例外情况,这些例外情况用作内部实现细节。
解决方法是将传递的工人类视为 的子类ListenableWorker
,而不是Worker
.
val workerclass = Class.forName(workerClassName).asSubclass(ListenableWorker::class.java)
推荐阅读
- next.js - Next.js 中的别名区域设置
- tensorboard - Tensorboard 图形页面仅显示在一个小区域
- reactjs - 如何从用户的以太坊地址进行 Tx?
- java - 有没有办法在 Struts 2 中使用带有键和值的 ActionError 来用异常消息替换属性文件中的替换参数?
- python - Django - 从 models.py 和迁移中删除表后,我得到“关系”不存在”
所以我意识到我可以删除一个表并将其作为多对多关系添加到另一个模型,然后我从文件夹中的迁移文件中删除了表的创建。但由于某种原因,当我打电话时,我收到以下错误
python manage.py migrate
django.db.utils.ProgrammingError: relation "<table name>" do
- javascript - 如何将不同纵横比的图像制作成相同的宽度和高度而不被裁剪?
- docker - 如何在容器运行时替换 docker-compose.yml 中服务命令中的环境变量?
- deployment - NextJS:在 EC2 中部署 SSR
- pyspark - 如何在 databricks 笔记本中访问具有相同容器名称的不同存储帐户
- reactjs - 如何在 ReactJS 中关闭浏览器或关闭标签页时调用注销 api?