Android WorkManager doesn't trigger one of the two scheduled workers
SOLVED: Worker not being triggered by WorkManager
Resolved the issue after some debugging. Posting here in case someone runs into the same issue.
So, I was canceling and enqueuing workers again and again. So lets say a worker is scheduled for 11.15 AM today, then I cancel and enqueue again, the 11.15 AM slot was not being given to the newly enqueued worker.
Instead, When the 11.15 AM slot is utilised, the work manager just checks that the scheduled worker was canceled and does not trigger the newly enqueued worker.
This was the behaviour on 3 out of 5 devices we tested on. On 2 devices the newly enqueued worker was properly being triggered.
Now the solution:
Remove all code to schedule your workers.
In the
onCreate()
of your application, first invokepruneWork()
onWorkManager
to remove all piled up cancelled worker schedules. Remember the method returnsOperation
which will help you check the completion of removal. Before callingpruneWork()
you might also callcancelAllWorkByTag()
for all your workers to clean up any and all the pending schedules. This method also returns anOperation
.After the work manager schedules are cleared, you can now schedule your
PeriodicWorkRequest
the way you want. I usedenqueueUniquePeriodicWork()
to make sure only one instance of worker is running at a time.
Now, my worker is being triggered every 15 minutes properly.
Note that as and when your device sleeps and goes into doze mode, this 15 minute duration will increase.
You can check the work manager database using Stetho library.
The table name is WorkSpec
where you'll find all the schedules for your workers. And you can stop app execution at some breakpoint and use getWorkInfosByTag()
on WorkManager
to get a list of schedules and their current status.