You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HiltWorker中注入依赖?实例化Worker时遇异常

Hilt注入CoroutineWorker时触发NoSuchMethodException异常

问题详情

为标注@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实例,而是尝试用默认的双参构造函数初始化,导致找不到对应方法。可按以下步骤修复:

  1. 确认依赖版本兼容性
    确保WorkManager与Hilt版本匹配,推荐使用:

    • WorkManager:androidx.work:work-runtime-ktx:2.7.0+
    • Hilt:com.google.dagger:hilt-android:2.40+
  2. 检查Application注册与WorkManager初始化

    • 确认BaseApplication已在Manifest中注册为应用入口:
      <application
          android:name=".BaseApplication"
          ...>
          ...
      </application>
      
    • 避免其他地方手动初始化WorkManager,防止覆盖自定义配置。
  3. 补充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'
    
  4. 清理重建项目
    执行Build -> Clean Project和Build -> Rebuild Project,清除编译缓存,确保Hilt生成的辅助注入代码更新。

  5. 验证Worker构造函数注解
    确认@AssistedInject和@Assisted注解无拼写错误,你的代码中这部分配置正确,可再次核对。


内容的提问来源于stack exchange,提问作者NiceToMytyuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:12:08