繁体   English   中英

Android如何使用Koin实现JobScheduler

[英]Android How to implement JobScheduler with Koin

由于易于实现 ,我开始将Koin用作服务定位器/ DI。 我面临有关的一个问题: Evernote Jobscheduler

到目前为止,我有以下代码:

class ForceUpdateJob : Job() {
const val TAG: String = "FORCE_UPDATE_JOB_TAG"

 fun scheduleJob() {
//Code
}
override fun onRunJob(params: Params): Result {
//Code
}

在我的SplashViewModel上,我这样调用所有工作:

 private fun scheduleJobs() {
    if (JobManager.instance().getAllJobRequestsForTag(Sync1.TAG).isEmpty())
        Sync1.scheduleJob()

    if (JobManager.instance().getAllJobRequestsForTag(Sync2.TAG).isEmpty())
        Sync2.scheduleJob()

    if (JobManager.instance().getAllJobRequestsForTag(ForceUpdateJob.TAG).isEmpty())
        ForceUpdateJob.scheduleJob()
}

我有一个像这样的工作创造者:

class MyJobCreator : JobCreator {

override fun create(tag: String): Job? = when (tag) {
    Sync1Job.TAG -> Sync1Job()
    Sync2Job.TAG -> Sync2Job()
    ForceUpdateJob.TAG -> ForceUpdateJob()
    else -> null
}
}

然后在我的App类上创建JobManager,如下所示:

  JobManager.create(this).addJobCreator(MyJobCreator())

它运行良好,我的所有工作都是定期的,每15分钟安排一次,一切运行正常。 (此结构遵循Jobscheduler github页面上的说明)

但是,当开始在Koin中使用DI时,已进行了以下更改:

我的模块具有我需要的所有依赖项:

val forceUpdateModule: Module = module {
bean { ForceUpdateDataSource() as ForceUpdateDataSourceInterface }
bean { ForceUpdateRepository(get()) as ForceUpdateRepositoryInterface }
factory { ForceUpdateWorker(get()) }
factory { ForceUpdateJob(get()) }
}

现在,我的Repository单例实例通过我的Worker的依赖关系传递,而Worker作为我的更新作业的依赖关系传递:

class ForceUpdateJob(val forceUpdateWorker: ForceUpdateWorker) : Job() 

class ForceUpdateWorker(val repository: ForceUpdateRepositoryInterface)

因此,为了使其正常工作,我必须更改JobCreator类:

class MyJobCreator(private val forceUpdateJob: ForceUpdateJob) : JobCreator

并为此创建一个新模块:

val jobSchedulerModule: Module = applicationContext {
factory { MyJobCreator(get()) }
}

奇怪的部分出现在AppCoordinator上,我创建了一个属性并将其注入:

所以这:

 JobManager.create(this).addJobCreator(MyJobCreator())

成为这样:

private val myJobCreator : MyJobCreator by inject()
JobManager.create(this).addJobCreator(myJobCreator)

我像这样开始koin:

private fun initKoin() {
    startKoin(this,
            listOf(forceUpdateModule,
                    splashModule,
                    jobSchedulerModule))
}

这确实是第一次。 但是当重新安排作业并尝试再次执行时,我的应用程序崩溃,但出现以下异常:

标签FORCE_UPDATE_TAG的作业已经运行,创建者应始终创建一个新的Job实例

关于我缺少什么的任何想法?

提前致谢

我认为您的问题与工作创建者不再创建工作有关。

作业创建者必须遵循工厂设计模式,每次您要重新安排作业时,都必须创建该作业的新实例。 因此,您的MyJobCreator应该只接收创建作业所需的依赖项。 不是工作本身。

因此,我将删除作业的koin工厂,并使您的MyJobCreator收到factoryUpdateWorker,并且它将具有以下创建方法:

class MyJobCreator(val forceUpdateWorker: ForceUpdateWorker) : JobCreator

    override fun create(tag: String): Job? = when (tag) {
        Sync1Job.TAG -> Sync1Job()
        Sync2Job.TAG -> Sync2Job()
        ForceUpdateJob.TAG -> ForceUpdateJob(forceUpdateWorker)
        else -> null
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM