我试图注入WorkManager与Hilt.首先我实现留档:
在类中使用 @HiltWorker 注释注入 Worker 并在 Worker 对象的构造函数中使用@AssistedInject。只能在 Worker 对象中使用@Singleton或无作用域绑定。您还必须使用@Assisted注释上下文和辅助角色参数依赖项:
@HiltWorker
class RetreiveQuestionWorkManager @AssistedInject constructor(
@Assisted val appContext : Context,
@Assisted val workerParameters: WorkerParameters,
val questionDao: QuestionDao,
val questionCacheMapper: QuestionCacheMapper)
: CoroutineWorker(appContext, workerParameters) {
...
}
然后我应用这个从留档:
然后,让Application类实现Configuration。提供程序接口,注入HiltWorkFactory的实例,并将其传递到WorkManager配置中,如下所示:
@HiltAndroidApp
class MyApp : Application(), Configuration.Provider {
@Inject lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
最后,我从留档照顾这张纸条:
注意:由于这会自定义工作管理器配置,因此您还必须从 AndroidManifest.xml 文件中删除默认初始值设定项,如工作管理器文档中指定的那样。
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove">
</provider>
但我得到了这个错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{mohalim.contest.alarm/mohalim.contest.alarm.ui.splash.SplashActivity}: kotlin.UninitializedPropertyAccessException: lateinit property workerFactory has not been initialized
...
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property workerFactory has not been initialized
...
您初始化workmanager和workmanagerfactory的方式仅适用于workmanager版本2.5.X。随着workmanager版本2.6.X-alphaX的更新,这一点发生了变化,现在workmanager正在使用androidx。启动以初始化WorkManager。
这里有两个选择:要么降级到我建议的2.5.0,因为这是当前的稳定版本,要么改变初始化工作管理器的方式。
如果要保留您的版本,请按以下方式更改您的 Android 清单:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities=\"${applicationId}.androidx-startup"
android:exported="false"
tools:node=\"merge">
<!-- If you are using androidx.startup to initialize other components -->
<meta-data
android:name="androidx.work.impl.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
运筹学
<!-- If you want to disable android.startup completely. -->
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove">
</provider>
此外,请确保您具有以下依赖关系:
implementation "com.google.dagger:hilt-android:$dagger_hilt_version"
kapt "com.google.dagger:hilt-compiler:$dagger_hilt_version"
kapt 'androidx.hilt:hilt-compiler:1.0.0'
implementation "androidx.hilt:hilt-work:1.0.0"
implementation 'androidx.work:work-runtime-ktx:2.7.0-alpha05'
解决 2 个问题使它对我有用:
正如@sanya5791所提到的,如果添加/更改启动提供程序不起作用,那么另一个要尝试的解决方案是添加HiltWorkerFactoryEntry Point,以防在on创建之前调用了WorkerCon人和它可以按照以下方式完成,以防链接不起作用,完整的解决方案如下所示:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<!-- If you are using androidx.startup to initialize other components -->
<meta-data
android:name="androidx.work.impl.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>