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
,但在调用它时尚未初始化.
我查了很多文件,但还是遗漏了一些东西.如有任何帮助,我将不胜感激!