実装が簡単なため、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 のジョブは既に実行されています。作成者は常に新しいジョブ インスタンスを作成する必要があります
私が欠けているものについてのアイデアはありますか?
前もって感謝します