try 使用Hilt和WorkManager将工作入队时遇到异常:

Could not instantiate my.example.package.widget.ExampleWorker
                 java.lang.NoSuchMethodException: my.example.package.widget.ExampleWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters]
                    at java.lang.Class.getConstructor0(Class.java:3325)
                    at java.lang.Class.getDeclaredConstructor(Class.java:3063)
                    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:1145)
                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
                    at java.lang.Thread.run(Thread.java:1012)
14:26:51.737  E  Could not create Worker my.example.package.widget.ExampleWorker

这是我的工人阶层:

@HiltWorker
class ExampleWorker @AssistedInject constructor(
    @Assisted private val context: Context,
    @Assisted workerParameters: WorkerParameters,
    private val exampleUseCase: ExampleUseCase
) : CoroutineWorker(context, workerParameters) {

    companion object {

        private val uniqueWorkName = ExampleWorker::class.java.simpleName

        fun enqueue(context: Context) {
            val manager = WorkManager.getInstance(context)
            val requestBuilder = PeriodicWorkRequestBuilder<ExampleWorker>(
                Duration.ofMinutes(15)
            )

            manager.enqueueUniquePeriodicWork(
                uniqueWorkName,
                ExistingPeriodicWorkPolicy.UPDATE,
                requestBuilder.build()
            )
        }
    }

    override suspend fun doWork(): Result {
        exampleUseCase.invoke()
        return Result.success()
    }
}

我的HiltApp:

@HiltAndroidApp
class HiltApp : Application(), Configuration.Provider {

    // https://developer.android.com/training/dependency-injection/hilt-jetpack#workmanager
    @Inject
    lateinit var workerFactory: HiltWorkerFactory

    override fun getWorkManagerConfiguration(): Configuration =
        Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()
}

在androidManifest.xml文件中,我按照教程的要求删除了默认的初始化式: https://developer.android.com/guide/background/persistent/configuration/custom-configuration#remove-default

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    tools:node="remove" />

我将简化的类注入到我的Worker中:

class ExampleUseCase @Inject constructor() {
    operator fun invoke() {}
}

以下是我的依赖项:

implementation("com.google.dagger:hilt-android:2.48.1")
ksp("com.google.dagger:hilt-android-compiler:2.48.1")

implementation("androidx.hilt:hilt-work:1.0.0")
ksp("androidx.hilt:hilt-compiler:1.0.0")

implementation("androidx.work:work-runtime-ktx:2.8.1")
implementation("androidx.work:work-runtime:2.8.1")

Gradle插件版本:8.1.1,Kotlin版本:1.9.10

在更新项目中的几个依赖项后,我遇到了这个异常,例如Gradle插件从7.4.1升级到8.1.1,Kotlin从1.8.0升级到1.9.10,Hilt从2.44.2升级到2.48.1,编译SDK从33升级到34等等.

我试图降级Hilt,然而,在这样做的过程中,我遇到了新的异常,我相信这可能是由于所有这些升级的库之间的版本不兼容造成的.

如果我从Worker构造函数中删除exampleUseCase参数,则将解析NoSuchMethodException.但是,我在doWork()方法中需要此字段.我试图将其注入为lateinit var,但在调用它时尚未初始化.

我查了很多文件,但还是遗漏了一些东西.如有任何帮助,我将不胜感激!

推荐答案

我认为这是KSP中的一个错误,参见this

Android相关问答推荐

打开平板电脑的下载文件夹中的文件,例如使用其mimeType将Intent发送到我们的应用程序

Jetpack编写Lazy列滑动删除动画不顺利结束

在不增加父行宽度的情况下添加延迟行或可滚动行

Yarn 机器人导致活动未找到,但Gradlew Run工作正常

Composable不会以LocalConext.Current作为活动呈现

默认调度程序是否在协程中使用共享线程池?

在带有REACT-Native-CLI的开发和生产中使用Firebase的最佳实践

OutlinedTextField仅显示一次

闪屏 API 无法在 Android 12 上运行(API 31、32)

我如何比较多个时间范围并在 Android Compose 中并排显示它们

NFC getNdefMessage 在 Android 13 上写入标签后返回 null

我该怎么做文本计时器

记住或不记得derivedStateOf

Android Compose:LazyColumn 和 Column with verticalScroll 的区别

Android Studio 错误要求依赖它的库和应用程序针对 Android API 的 33 版或更高版本进行编译.

Android Studio:如何添加应用程序质量洞察窗口以查看 Android Studio 中的 Crashlytics 数据?

禁用通知权限后启动前台服务导致崩溃(Android 13)

如何使用jetpack compose实现布局,其中图标在列布局上是绝对位置

Android:在模块 jetified-play-services-measurement 和 jetified-play-services-measurement-impl 中发现重复类

即使会话已暂停且音频已禁用,Android 设备仍显示正在使用麦克风