使用Hilt Worker时触发java.lang.NoSuchMethodException的问题求助
使用Hilt Worker时触发java.lang.NoSuchMethodException的问题求助
各位大佬好,我在使用Hilt结合WorkManager开发通知Worker的时候,遇到了一个棘手的问题——Worker始终无法正常初始化,直接抛出了java.lang.NoSuchMethodException异常。我已经按照官方文档的步骤配置了相关内容,但还是没解决,想请大家帮忙排查一下问题所在。
我的Worker类代码
@HiltWorker class AnilistNotificationWorker @AssistedInject constructor( @Assisted private val context: Context, @Assisted workerParams: WorkerParameters, private val sharedPreferences: UserPreferencesRepository ) : CoroutineWorker(appContext = context, params = workerParams) { override suspend fun doWork(): Result { println("executing worker") return Result.success() } }
Application类配置(已实现WorkManager的Configuration.Provider)
@HiltAndroidApp class MyApplication : Application(), Configuration.Provider { @EntryPoint @InstallIn(SingletonComponent::class) interface HiltWorkerFactoryEntryPoint { fun hiltWorkerFactory(): HiltWorkerFactory } override fun onCreate() { super.onCreate() scheduleApiWorker() } override val workManagerConfiguration: Configuration get() = Configuration.Builder() .setWorkerFactory( EntryPointAccessors.fromApplication(this, HiltWorkerFactoryEntryPoint::class.java) .hiltWorkerFactory() ) .build() private fun scheduleApiWorker() { val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build() println("Scheduling notification worker") val notificationWorkRequest = OneTimeWorkRequestBuilder<AnilistNotificationWorker>() .setConstraints(constraints) .build() WorkManager.getInstance(this).enqueue(notificationWorkRequest) } }
DataStore相关配置
DataStore扩展与Module
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user_preferences") @Module @InstallIn(SingletonComponent::class) object DataStoreModule { @Provides @Singleton fun providesDataStore(@ApplicationContext context: Context): DataStore<Preferences> { return context.dataStore } }
Repository Module与实现
@Module @InstallIn(SingletonComponent::class) object RepositoryModule { @Provides @Singleton fun providesUserPreferencesRepository(dataStore: DataStore<Preferences>): UserPreferencesRepository { return UserPreferencesRepository(dataStore) } } @Singleton class UserPreferencesRepository (private val dataStore: DataStore<Preferences>)
AndroidManifest配置(已移除WorkManager默认Initializer)
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <meta-data android:name="androidx.work.WorkManagerInitializer" android:value="androidx.startup" tools:node="remove" /> </provider>
Gradle配置
项目根目录build.gradle
plugins { // ... id("com.google.dagger.hilt.android") version "2.57.1" apply false }
App模块build.gradle
plugins { // ... id("kotlin-kapt") id("com.google.dagger.hilt.android") } kapt { correctErrorTypes = true } dependencies { implementation(libs.androidx.hilt.common) implementation(libs.hilt.android) implementation(libs.androidx.work.runtime.ktx) implementation(libs.androidx.hilt.work) kapt(libs.hilt.android.compiler) implementation(libs.androidx.datastore.preferences) }
版本配置(libs.versions.toml)
[versions] datastorePreferences = "1.1.7" hiltAndroid = "2.57.1" workRuntimeKtx = "2.10.3" hiltCommon = "1.2.0" hiltWork = "1.2.0" [libraries] androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastorePreferences" } hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hiltAndroid" } hilt-android-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hiltAndroid" } androidx-work-runtime-ktx = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "workRuntimeKtx" } androidx-hilt-common = { group = "androidx.hilt", name = "hilt-common", version.ref = "hiltCommon" } androidx-hilt-work = { group = "androidx.hilt", name = "hilt-work", version.ref = "hiltWork" }
完整异常栈trace
java.lang.NoSuchMethodException: com.example.myani.data.notification.AnilistNotificationWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters] at java.lang.Class.getConstructor0(Class.java:3385) at java.lang.Class.getDeclaredConstructor(Class.java:3067) at androidx.work.WorkerFactory.createWorkerWithDefaultFallback$fallbackToReflection(WorkerFactory.kt:87) at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.kt:96) at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.kt:234) at androidx.work.impl.WorkerWrapper.access$runWorker(WorkerWrapper.kt:67) at androidx.work.impl.WorkerWrapper$run$1.invoke(WorkerWrapper.kt:259) at androidx.work.impl.WorkerWrapper$run$1.invoke(WorkerWrapper.kt:256) at androidx.work.impl.utils.SerialExecutorImpl$Task.run(SerialExecutorImpl.kt: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:923)
我已经检查过Hilt和WorkManager的版本兼容性,也确认了Manifest里移除了默认的WorkManager初始化器,Application也正确提供了HiltWorkerFactory,但Worker还是会触发反射找不到构造方法的问题,感觉像是Hilt没有生成对应的Worker工厂类?或者哪里的配置有冲突?麻烦各位帮忙看看,谢谢啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

