【问题标题】:Could not instantiate worker when injecting into a work class注入工作类时无法实例化工作者
【发布时间】:2022-07-19 02:00:04
【问题描述】:

我正在为我的项目使用 android 应用启动、刀柄和空间。尝试将工作排入队列时出现错误:

com.test E/WM-WorkerFactory: Could not instantiate com.test.RefreshWorker
    java.lang.NoSuchMethodException: com.test.RefreshWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters] 

<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" />
    <meta-data
        android:name="com.test.RefreshInitializer"
        android:value="androidx.startup" />
</provider>

我的应用程序类:

@HiltAndroidApp
class TestApplication: Application(), Configuration.Provider {
   @Inject
   lateinit var workerFactory: HiltWorkerFactory

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

我的工人:

@HiltWorker
class RefreshWorker @AssistedInject constructor(
   @Assisted context: Context,
   @Assisted params: WorkerParameters,
   private val repository: Repository,
) : CoroutineWorker(context, params) {
   override suspend fun doWork(): Result = try {
      repository.fetch()
      Result.success()
   } catch (error: Throwable) {
      Result.failure()
   }
}

最后是我对工作和刀柄的依赖: def hilt_version = '2.41' def work_version = '2.7.1' 实施“com.google.dagger:hilt-android:$hilt_version” kapt "com.google.dagger:hilt-compiler:$hilt_version" 实现 'androidx.hilt:hilt-work:1.0.0' kapt 'androidx.hilt:hilt-compiler:1.0.0' annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0' 实现“androidx.work:work-runtime-ktx:$work_version”

如果我不注入我自己的依赖,一切都很好。我已经仔细检查了我的依赖项。知道我缺少什么吗?

编辑:

如果有帮助,我注意到我的应用程序类中没有调用 getWorkManagerConfiguration()。为了验证我的清单是否正确使用了正确的类,我确实看到在我的应用程序类中调用了 onCreate()。调试到 WorkManager 初始化代码,看起来 WorkManager 仍然是通过 android 启动来初始化工作管理器。我现在检查了我的清单几次,我相信它正确地从应用启动中删除了工作管理器。

【问题讨论】:

  • 请问您解决了吗?

标签: android android-room dagger-hilt


【解决方案1】:

在 gradle 中添加这个:

    kapt("androidx.hilt:hilt-compiler:1.0.0")

以前我没有(),但用空格代替。

在清单中

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

应用

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

    @Inject
    lateinit var workerFactory: HiltWorkerFactory

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

检查你的毕业典礼: Injecting CoroutineWorker with Hilt : Could not instantiate woker

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2018-02-11
    相关资源
    最近更新 更多