1

実装が簡単なため、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 分ごとにスケジュールされており、すべて正常に動作しています。(この構造は、ジョブスケジューラの github ページの指示に従います)

しかし、Koin で DI を使い始めると、次の変更が加えられました。

必要なすべての依存関係を含むモジュールがあります。

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

リポジトリ シングルトン インスタンスはワーカーの依存関係によって渡され、ワー​​カーは更新ジョブの依存関係として渡されます。

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 のジョブは既に実行されています。作成者は常に新しいジョブ インスタンスを作成する必要があります

私が欠けているものについてのアイデアはありますか?

前もって感謝します

4

1 に答える 1