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

使用WorkManager与Dagger-Hilt时Worker无法实例化的问题

问题原因分析
  1. 自定义WorkerFactory未被正确使用:你的Application类中注入的是HiltWorkerFactory,而非自己实现的MyWorkerFactory。WorkManager fallback到默认构造函数查找逻辑时,由于Worker添加了自定义依赖,不存在仅接收Context和WorkerParameters的构造函数,因此抛出NoSuchMethodException。
  2. ChildWorkerFactory接口设计不合理:该接口的create方法返回具体的UploadTripsWorker,不符合多绑定的抽象要求,可能导致Dagger无法正确生成绑定代码。
  3. Hilt依赖版本不一致:hilt-android版本为2.49,但hilt-compiler版本为2.44,版本不匹配会导致编译时生成的DI代码异常。
解决方案

1. 修正Application类,使用自定义MyWorkerFactory

将Application中注入的WorkerFactory替换为自己的MyWorkerFactory,确保WorkManager使用自定义工厂创建Worker:

@HiltAndroidApp
class MyAppApplication : Application(), Configuration.Provider {
    @Inject
    lateinit var workerFactory: MyWorkerFactory // 替换为自定义工厂类

    override val workManagerConfiguration: Configuration
        get() = Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()

    override fun onCreate() {
        super.onCreate()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(
                "location",
                "Location Service",
                NotificationManager.IMPORTANCE_LOW
            )
            val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.createNotificationChannel(channel)
        }

        WorkManager.initialize(this, workManagerConfiguration)
    }
}

2. 修正ChildWorkerFactory接口

将create方法的返回类型改为ListenableWorker,保持抽象性以适配多Worker场景:

import android.content.Context
import androidx.work.ListenableWorker
import androidx.work.WorkerParameters

interface ChildWorkerFactory {
    fun create(appContext: Context, params: WorkerParameters): ListenableWorker
}

同时更新UploadTripsWorker中的Factory接口实现:

@AssistedFactory
interface Factory : ChildWorkerFactory {
    override fun create(appContext: Context, params: WorkerParameters): UploadTripsWorker
}

3. 统一Hilt依赖版本

确保hilt-android和hilt-compiler版本一致,避免编译异常:

// Dagger-Hilt
implementation "com.google.dagger:hilt-android:2.49"
kapt "com.google.dagger:hilt-compiler:2.49" // 与hilt-android版本保持一致
implementation 'androidx.hilt:hilt-common:1.2.0'
implementation 'androidx.hilt:hilt-work:1.2.0'

// Work
implementation "androidx.work:work-runtime-ktx:2.9.0"

4. 验证WorkerBindingModule绑定逻辑

确认WorkerBindingModule中的多绑定配置无误:

@Module
@InstallIn(SingletonComponent::class)
interface WorkerBindingModule {
    @Binds
    @IntoMap
    @WorkerKey(UploadTripsWorker::class)
    fun bindUploadTripsWorker(factory: UploadTripsWorker.Factory): ChildWorkerFactory
}

5. 清理并重新编译项目

执行以下操作确保DI代码生成正确:

  • 执行Build > Clean Project
  • 执行Build > Rebuild Project
  • 清除应用缓存后重新运行
验证

完成上述修改后,WorkManager会通过自定义MyWorkerFactory获取对应的ChildWorkerFactory,正确注入所有自定义依赖,避免构造函数找不到的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:48:10