【问题标题】:Injecting CoroutineWorker with Hilt : Could not instantiate woker使用 Hilt 注入 CoroutineWorker:无法实例化 wker
【发布时间】:2021-07-26 23:52:35
【问题描述】:

问了同样的问题,但它们对我不起作用,一开始我使用的是最新版本的工作管理器,它是 2.7 alpha 3,但我降级了,因为它只兼容 android 12 preview sdk,错误仍然留在那儿!
它无法实例化工作人员,因为这些依赖项包含在工作人员的构造函数中,在我添加它们之前它正在工作,但如果我不能添加它们,那么刀柄没有任何好处,所以情况如下:

Manifest 不包含任何与工作管理器相关的配置!

应用类:

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

@Inject
lateinit var workerFactory: HiltWorkerFactory

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

}

工人:

@HiltWorker
class DriveSyncWorker @AssistedInject constructor(
    @Assisted val context: Context,
    @Assisted workerParams: WorkerParameters,
    val dependency: StorageHelper,
)

注意:它没有使用 HiltWorkFactory!

错误:

E/WM-WorkerFactory: Could not instantiate com.wakaztahir.timeline.utils.workers.DriveSyncWorker
    java.lang.NoSuchMethodException: com.wakaztahir.timeline.utils.workers.DriveSyncWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters]
        at java.lang.Class.getConstructor0(Class.java:2332)
        at java.lang.Class.getDeclaredConstructor(Class.java:2170)
        at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:95)
        at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:244)
        at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:136)
        at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
        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)
E/WM-WorkerWrapper: Could not create Worker com.wakaztahir.timeline.utils.workers.DriveSyncWorker

分级:

implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-compiler:$hilt_version"

def work_version = "2.6.0-alpha02"
implementation "androidx.work:work-runtime-ktx:$work_version"
implementation 'androidx.hilt:hilt-work:1.0.0-beta01'
implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'

链接:

Cannot Inject coroutine worker using hilt
Injecting coroutine worker using hilt

【问题讨论】:

    标签: android android-workmanager dagger-hilt


    【解决方案1】:

    由于您使用高于 2.6.0-alpha01 的工作管理器版本,因此高于 2.6.0-alpha01 的工作管理器版本使用启动初始化程序 Read Here

    将此提供程序添加到您的应用AndroidManifest.xml

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

    【讨论】:

    • 但是您正在从应用程序中覆盖getWorkManagerConfiguration(因为 Hilt 需要它),因此您需要将该提供程序添加到清单中。
    • 我做到了,它仍然给出错误!它在文档中说: 注意:因为这自定义了 WorkManager 配置,所以您还必须按照 WorkManager 文档中的指定从 AndroidManifest.xml 文件中删除默认初始化程序。 developer.android.com/training/dependency-injection/…
    • 感谢您的帮助!
    • 它解决了我使用workmanager版本2.7.0-rc01的问题
    【解决方案2】:

    您的 gradle 文件中缺少一个额外的 kapt 定义:

    // When using Kotlin.
    kapt("androidx.hilt:hilt-compiler:1.0.0")
    
    // When using Java.
    annotationProcessor("androidx.hilt:hilt-compiler:1.0.0")
    

    documentation

    【讨论】:

    • 我正在使用kapt "com.google.dagger:hilt-compiler:$hilt_version",但不用担心,问题已通过上面的答案解决,请检查编辑
    • 我正在写这个答案,因为我昨天遇到了同样的问题,只有kapt "com.google.dagger:hilt-compiler:$hilt_version" 是不够的。添加额外的kapt("androidx.hilt:hilt-compiler:1.0.0") 后一切都很好。所以我的工作解决方案是同时拥有 kapt 定义 + 接受的清单设置
    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 2020-11-22
    • 2020-12-07
    • 1970-01-01
    • 2021-11-14
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多