当前位置: 首页 > 知识库问答 >
问题:

注入工作类时无法实例化工作进程

马国源
2023-03-14

我正在为我的项目使用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()
         .html" target="_blank">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’implementation“com.google.dagger:刀柄android:$hilt_version”kapt“com.gougle.dagger:hilt compiler:$hitt_version”implementation'androidx.hilt:刀柄工作:1.0.0‘kapt’androidx“androidx.work:工作运行时ktx:$work_version”

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

编辑:

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

共有1个答案

徐经武
2023-03-14

溶液:

检查您的gradle:注入带有句柄的协同工作器:无法实例化工作器

点击这里查看:https://github.com/google/dagger/issues/2601 https://developer . Android . com/topic/libraries/architecture/work manager/advanced/custom-configuration

在gradle中添加的正是这个:

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

以前我有相同的,但没有< code>(),而是空格。

在清单中

 <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()
}

我的分级版本:

    hilt_version = "2.37"
    hilt_deps = [
            classpath_plugin: "com.google.dagger:hilt-android-gradle-plugin:$hilt_version",
            hilt            : "com.google.dagger:hilt-android:$hilt_version",
            compiler        : "com.google.dagger:hilt-android-compiler:$hilt_version"
    ]


    kapt hilt_deps.compiler
    kapt("androidx.hilt:hilt-compiler:1.0.0")
    implementation hilt_deps.hilt
    implementation 'androidx.hilt:hilt-work:1.0.0'
    lifecycle_version = "2.4.0-alpha02"
    lifecycle_deps = [
            viewmodel: "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version",
            lifecycle: "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version",
            compiler : "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
    ]

检查你是否有@Inject constructor() 与你想要提供的类。

 类似资料:
  • 我试图在CDI注入的帮助下实现某种“插件特性”。但我遇到了一些麻烦,我想我可能会从我的同事“堆垛工”那里得到一些外部的观点:-) 到目前为止,我已经做到了这一点: 当我“运行”这个时,两个字段都会被注入相应的实例。但当我尝试像这样更“动态”地注入它们时: 然后我会得到这样一个例外: 这对我来说似乎很奇怪,因为CDI显然“知道”我感兴趣的实例,因为直接注入类型化字段是有效的。所以我想这一定和资格赛有

  • 现象 workerman已经正常启动,但是按照官网写的例子或者下载的demo无法工作,例如页面打不开,socket连接失败等 解决方法 一般这种workerman启动没报错,但是无法打开页面或者无法连接的问题都是由于服务器防火墙导致的。请先关闭服务器防火墙再进行测试,如果经确认是防火墙问题,请重新设置防火墙规则。

  • 我目前正在用JavaFX做一个小项目。我使用SceneBuilder创建了我的GUI的第一个草图。它仍然需要一些调整和样式,但我想看看它是否工作到目前为止。 我在GUI上有两个超链接,如果用户单击其中一个,默认的系统浏览器将打开一个特定的URL。 到目前为止,我得到了这个: 主要的爪哇: 数据库。爪哇: 测试视图。爪哇: 在我的控制器中,我想将ActionHandler设置为超链接,但它不起作用,

  • 我已经修复了firebase实时数据库上的读取和正确规则,但我仍然无法对其进行读取和写入。 我也试过这个: Firebase存储规则: Firebase存储规则工作正常,因为图像已上载并调用onSuccessListener。 我用来在数据库上设置值的代码如下所示,我已经将引用定义为:

  • 我有一个精简的测试项目,其中包含一个Servlet3.0版本,使用如下注释声明: 我尝试使用Embedded Tomcat7进行JUnit测试。启动嵌入式Tomcat时,只能通过web.xml(/testwebxml)中声明的URL模式访问servlet。如果我试图通过注释(/test)声明的URL模式访问它,它会说404页找不到。 下面是我测试的代码: 为了确保正确设置了项目,我还安装了一个实际

  • 我被鼓励开始android开发,所以我安装了android studio,并尝试启动Hello-world项目。我安装了android studio,它下载了所有必需的文件。我在android studio网站上遵循了guide,但每次尝试创建一个空活动-项目时,我都有很多错误。我试着改变SDK版本,但我对java和android开发完全是新手,不能理解我做错了什么。拜托,我花了一整天的时间来解决