前言
在快节奏的移动应用开发世界中,有效地管理后台任务是创建健壮且响应迅速的应用程序的关键方面。无论是定期数据同步、通知还是资源密集型操作,Android开发人员经常发现自己在努力应对后台任务执行的复杂性。这就是Android提供的强大而灵活的库WorkManager的用武之地。
那么如何将WorkManager与Hilt(一种流行的依赖注入框架)无缝集成呢?
实践
- 添加依赖项
首先,我们需要向我们的项目添加一些依赖关系:
// Hilt
implementation 'androidx.hilt:hilt-work:1.0.0'
kapt 'androidx.hilt:hilt-compiler:1.0.0'
// WorkManager
implementation "androidx.work:work-runtime-ktx:2.8.1"
您可以在官方网站上找到更多关于库的版本的信息
文档
- workManager
- hilt with workmanager
Note: 如果您还没有在您的项目中设置Dagger Hilt,您可以按照官方文档进行设置并无缝运行。
Code
例如一个简单的worker类
class SimpleWorker(
appContext : Context,
params : WorkerParameters
) : Worker(appContext,params) {
override fun doWork(): Result {
// Do your background work
// Return result
return Result.success()
}
}
考虑这样一个场景:您的后台任务需要访问各种助手类、数据源或服务。如果没有适当的依赖管理,您可能会发现自己陷入手动依赖实例化和潜在内存泄漏的困境
为了防止这种情况发生,我们使用hill将所需的依赖项注入到worker中
Example
举一个例子,worker需要访问储存库类中的一些函数,后者由Hilt提供,我们需要将它注入worker中。
为了在worker类中注入我们的存储库,我们必须在类中使用@HiltWorker注释,并用@AssistedInject注释构造函数
例如一个简单的worker类:
@HiltWorker
class SimpleWorker @AssistedInject constructor(
private val repo : DefaultRepo,
@Assisted appContext : Context,
@Assisted params : WorkerParameters
) : Worker(appContext,params){
override fun doWork(): Result {
// Do your background work
// Return result
return Result.success()
}
}
你可能会注意到,我们用@Assisted来注释appContext和参数,而其他的参数则不用。
下一步是实现Configuration。并提供一个worker配置,如下所示:
@HiltAndroidApp
class AppClass : Application(), Configuration.Provider{
@Inject lateinit var workerFactory : HiltWorkerFactory
override fun getWorkManagerConfiguration(): Configuration {
return Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
}
现在,如果我们运行应用程序并启动WorkManager,我们可能会得到一个NoSuchMethodException,这是因为应用程序仍然使用默认的WorkerFactory来初始化我们的worker,而后者不知道如何获得存储库的实例。
为了解决这个问题,我们必须删除默认的初始化器,我们通过在AndroidManifest.xml文件中添加这个块来实现:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove" />
示例程序
https://github.com/shakeabdulrahman/HiltWorkSample
翻译自: https://bbluecoder.medium.com/how-to-use-workmanager-with-hilt-in-android-b60046ff7f02