![](/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.