使用WorkManager与Dagger-Hilt时Worker无法实例化的问题
问题原因分析
- 自定义WorkerFactory未被正确使用:你的Application类中注入的是
HiltWorkerFactory,而非自己实现的MyWorkerFactory。WorkManager fallback到默认构造函数查找逻辑时,由于Worker添加了自定义依赖,不存在仅接收Context和WorkerParameters的构造函数,因此抛出NoSuchMethodException。 - ChildWorkerFactory接口设计不合理:该接口的
create方法返回具体的UploadTripsWorker,不符合多绑定的抽象要求,可能导致Dagger无法正确生成绑定代码。 - 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
相关产品推荐
相关产品推荐

