我正在尝试更新我的简单android应用程序以使用Dagger2。我想我已经了解了一些基础知识,并且通过它创建了一些基本的东西(活动,视图模型,助手)。
现在,仍然有一个小陷阱:应用程序具有一个按钮,当按下该按钮时,必须安排工作服务。我可以重构作业服务,以便其依赖关系通过其构造函数传递,但是如何从活动中实例化它呢?换句话说,我该如何替换此代码:
val serviceComponent = ComponentName(getApplication(), DbUpdaterJob::class.java)
var jobInfo = JobInfo.Builder(DB_UPDATER_JOB_ID, serviceComponent)
.setRequiredNetworkType(networkType)
.setPersisted(true)
.build()
val scheduler = getApplication<Application>().getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
val res = scheduler.schedule(jobInfo)
那么实例化就降为匕首了?
谢谢!
答案 0 :(得分:0)
您需要定义提供者:
@Provides
fun provideServiceComponent(app: Application): ComponentName =
ComponentName(app, DbUpdaterJob::class.java) // assuming you have only one ServiceComponent
@Provides
fun provideJobInfo(
serviceComponent: ComponentName
): JobInfo =
JobInfo.Builder(DB_UPDATER_JOB_ID)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE)
.setPersisted(true)
.build()
@Provides
@Singleton
fun provideJobScheduler(app: Application): JobScheduler = app.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
然后注入
@Inject constructor(
jobInfo: JobInfo,
scheduler: JobScheduler
) {
val res = scheduler.schedule(jobInfo)
...
}
如果您希望能够创建其他ComponentName或JobInfo等,它将变得更加复杂。在这种情况下,您需要使用@Named注入。