簡體   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