【Android】workManager和hilt高效构建你的应用

Android workManager和hilt高效构建你的应用

前言

在快节奏的移动应用开发世界中,有效地管理后台任务是创建健壮且响应迅速的应用程序的关键方面。无论是定期数据同步、通知还是资源密集型操作,Android开发人员经常发现自己在努力应对后台任务执行的复杂性。这就是Android提供的强大而灵活的库WorkManager的用武之地。

那么如何将WorkManager与Hilt(一种流行的依赖注入框架)无缝集成呢?

实践

  1. 添加依赖项

首先,我们需要向我们的项目添加一些依赖关系:

// 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

https://developer.android.com/develop/background-work/background-tasks/persistent/getting-started?source=post_page-----b60046ff7f02--------------------------------

  • hilt with workmanager

https://developer.android.com/training/dependency-injection/hilt-jetpack?source=post_page-----b60046ff7f02--------------------------------#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mozhimen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值