如何在HiltWorker中注入依赖?实例化Worker时遇异常
问题详情
为标注@HiltWorker的CoroutineWorker注入LicenseRepository,完成官方文档要求的配置后,运行时出现Worker实例化失败的错误:
2023-03-02 14:54:08.570 13936-14117 WM-WorkerFactory
it.gabtamagnini.visualstock E 无法实例化it.gabtamagnini.visualstock.utils.LicenseWorker
java.lang.NoSuchMethodException: it.gabtamagnini.visualstock.utils.LicenseWorker. [class android.content.Context, class androidx.work.WorkerParameters]
at java.lang.Class.getConstructor0(Class.java:2332)
at java.lang.Class.getDeclaredConstructor(Class.java:2170)
at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:95)
at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:243)
at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:145)
at androidx.work.impl.utils.SerialExecutorImpl$Task.run(SerialExecutorImpl.java:96)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
2023-03-02 14:54:08.571 13936-14117 WM-WorkerWrapper it.gabtamagnini.visualstock
E 无法创建Worker it.gabtamagnini.visualstock.utils.LicenseWorker
相关代码
LicenseWorker实现
@HiltWorker class LicenseWorker @AssistedInject constructor( @Assisted context: Context, @Assisted params: WorkerParameters, private val repository: LicenseRepository ) : CoroutineWorker(context, params) { override suspend fun doWork(): Result { // TODO: check if the license if still valid and if so return Result.success() else Result.failure() return try { val license = withContext(Dispatchers.IO) { repository.getLicense() } Log.i("License", license.id) Result.success() } catch (e: Exception) { Result.failure() } } }
Manifest配置
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" tools:node="remove"> </provider>
Application实现
@HiltAndroidApp class BaseApplication : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getWorkManagerConfiguration() = Configuration.Builder() .setWorkerFactory(workerFactory) .build() }
补充说明
该问题并非仅针对LicenseRepository,注入任何依赖都会触发异常;移除所有依赖后,Worker可正常运行。
解决方案
异常核心原因是WorkManager未使用Hilt提供的HiltWorkerFactory创建Worker实例,而是尝试用默认的双参构造函数初始化,导致找不到对应方法。可按以下步骤修复:
确认依赖版本兼容性
确保WorkManager与Hilt版本匹配,推荐使用:- WorkManager:
androidx.work:work-runtime-ktx:2.7.0+ - Hilt:
com.google.dagger:hilt-android:2.40+
- WorkManager:
检查Application注册与WorkManager初始化
- 确认
BaseApplication已在Manifest中注册为应用入口:<application android:name=".BaseApplication" ...> ... </application> - 避免其他地方手动初始化WorkManager,防止覆盖自定义配置。
- 确认
补充Hilt WorkManager支持依赖
在Module级别的build.gradle中添加必要依赖(注意kapt注解处理器必须配置):implementation 'com.google.dagger:hilt-android:2.44' kapt 'com.google.dagger:hilt-android-compiler:2.44' implementation 'androidx.hilt:hilt-work:1.0.0' kapt 'androidx.hilt:hilt-compiler:1.0.0'清理重建项目
执行Build -> Clean Project和Build -> Rebuild Project,清除编译缓存,确保Hilt生成的辅助注入代码更新。验证Worker构造函数注解
确认@AssistedInject和@Assisted注解无拼写错误,你的代码中这部分配置正确,可再次核对。
内容的提问来源于stack exchange,提问作者NiceToMytyuk

