![](/img/trans.png)
[英]How to implement JobScheduler to scan for Bluetooth beacons in the background?
[英]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.