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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 09:13:07