Open smuldr opened 11 months ago
Hi, I have the same issue. Is there any solution or workaround for this?
We ended up removing the koin-androidx-workmanager
library completely and made our workers KoinComponents
so they can get or inject their dependencies when they actually do the work.
class MyWorker(
appContext: Context,
params: WorkerParameters,
) : Worker(appContext, params),
KoinComponent {
// Use `by inject()` to get a lazy dependency.
private val myDependency: SomeClass by inject()
override suspend fun doWork(): Result {
// Only access the dependency in `doWork()`
myDependency.doSomething()
TODO("Return a result")
}
}
This makes the class more difficult to test but at least the crashes went away. I guess that this approach gives Koin a little more time to get the dependency graph ready.
Can you check how I setup it in NowInAndroid, and compare with yours? https://github.com/InsertKoinIO/nowinandroid
That is a big project to quickly check for the setup! 😄 Are you talking about the way you manually trigger the SyncWorker in the app's Application right here?
I am afraid that we have too much code relying on having Koin initialized via the AndroidX Startup library to quickly make this change. I should really put together a demo project to help figure out the cause of this crash rather than try to find a workaround.
Seems that worker is not well defined. But it needs deeper investigation on your side 🤔
Even in small workers and apps, this issue can happen:
@KoinWorker
class ScheduleRemindersWorker(
context: Context,
params: WorkerParameters,
private val reminderRepository: RemindersRepository
) : TaskCoroutineWorker(context, params) {
override suspend fun doTask() {
reminderRepository.scheduleReminders()
}
}
// execution
workManager.enqueueUniqueWork(
ScheduleRemindersWorker.NAME_STARTUP,
ExistingWorkPolicy.KEEP,
OneTimeWorkRequest.from(ScheduleRemindersWorker::class.java),
)
Stack trace:
Fatal Exception: org.koin.core.error.InstanceCreationException: Could not create instance for '[Factory: 'app.resubs.data.reminder.ScheduleRemindersWorker',qualifier:app.resubs.data.reminder.ScheduleRemindersWorker,binds:androidx.work.c]'
at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:58)
at org.koin.core.instance.FactoryInstanceFactory.get(FactoryInstanceFactory.kt:38)
at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:110)
at org.koin.core.scope.Scope.resolveFromRegistry(Scope.kt:321)
at org.koin.core.scope.Scope.resolveFromContext(Scope.kt:311)
at org.koin.core.scope.Scope.stackParametersCall(Scope.kt:281)
at org.koin.core.scope.Scope.resolveInstance(Scope.kt:259)
at org.koin.core.scope.Scope.resolveWithOptionalLogging(Scope.kt:232)
at org.koin.core.scope.Scope.get(Scope.kt:215)
at org.koin.core.scope.Scope.getOrNull(Scope.kt:178)
at org.koin.androidx.workmanager.factory.KoinWorkerFactory.createWorker(KoinWorkerFactory.kt:47)
at androidx.work.DelegatingWorkerFactory.createWorker(DelegatingWorkerFactory.java:71)
at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java)
at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:243)
at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:144)
at androidx.work.impl.utils.SerialExecutorImpl$Task.run(SerialExecutorImpl.java:96)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
at java.lang.Thread.run(Thread.java:1012)
Questions to look into:
Describe the bug We get occasional crashes when using
koin-androidx-workmanager
to inject our worker classes. It seems like this is a continuation of #1623.To Reproduce
Our flow is as follows:
Both the periodic and the one time workers produce NoBeanDefFoundEception crashes. It only happens to a small percentage of users, but it still happens with every release we make.
Koin module and version: