The ServiceThread currently tests a bunch of conditions for whether there is work to do. The first one that is true triggers doing the associated work (and only that work). This means that work associated with later tests may be deferred for an arbitrarily long time by frequently having work available from earlier tests.
Better would be to perform all the tests and either wait if none indicate available work, or do all of the available work, and then try again.
Better would be to perform all the tests and either wait if none indicate available work, or do all of the available work, and then try again.