# HG changeset patch # User Vladimir Vukicevic # Date 1198984554 28800 # Node ID ffd2c53b98e6bbef73fccf124cfdd2b8da1b849f # Parent 11244d5ac8494533dd5d137a000ff6047eb785e6 Don't block UI when adding an item to network queue while queue is running Most visible if you have a few characters whose skills are all being updated; if you attempt to view any character's market orders, the UI will block. diff -r 11244d5ac8494533dd5d137a000ff6047eb785e6 -r ffd2c53b98e6bbef73fccf124cfdd2b8da1b849f src/org/mrrupert/eveberry/EveBerryBackground.java --- a/src/org/mrrupert/eveberry/EveBerryBackground.java Sat Dec 29 19:09:33 2007 -0800 +++ b/src/org/mrrupert/eveberry/EveBerryBackground.java Sat Dec 29 19:15:54 2007 -0800 @@ -229,10 +229,20 @@ while (!sFinished) { EveCharacterManager mgr = EveCharacterManager.Manager(); - synchronized(this) { - // do the entire work queue at once - for (int i = 0; i < mWorkQueue.size(); i++) { - final WorkItem wi = (WorkItem) mWorkQueue.elementAt(i); + boolean hasMoreWork = true; + + do { + WorkItem item = null; + + synchronized(this) { + if (mWorkQueue.size() > 0) { + item = (WorkItem) mWorkQueue.elementAt(0); + mWorkQueue.removeElementAt(0); + } + } + + if (item != null) { + final WorkItem wi = item; if (wi.WorkType == ITEM_CHARACTER_UPDATE) { final EveCharacterInfo eci = (EveCharacterInfo) wi.Item; @@ -288,41 +298,44 @@ } } - mWorkQueue.removeAllElements(); + synchronized(this) { + if (mWorkQueue.size() == 0) + hasMoreWork = false; + } + } while (hasMoreWork); - long nextUpdateDelay = computeUpdateTimes(); + long nextUpdateDelay = computeUpdateTimes(); - if (nextUpdateDelay == 0) { - synchronized(mgr) { - Enumeration iter = mgr.enumerateCharacters(); - while (iter.hasMoreElements()) { - EveCharacterInfo eci = (EveCharacterInfo) iter.nextElement(); - EveBerry.debug("++++ Background: queuing update for " + eci.Name); - queueCharacterUpdate(eci, null, null); - } - } - } + if (nextUpdateDelay == 0) { + synchronized(mgr) { + Enumeration iter = mgr.enumerateCharacters(); + while (iter.hasMoreElements()) { + EveCharacterInfo eci = (EveCharacterInfo) iter.nextElement(); + EveBerry.debug("++++ Background: queuing update for " + eci.Name); + queueCharacterUpdate(eci, null, null); + } + } + } - // check if we need to notify anything - checkAndDispatchNotifications(); + // check if we need to notify anything + checkAndDispatchNotifications(); - EveBerry.debug("XXXXXXX nextUpdateDelay in: " + nextUpdateDelay); + EveBerry.debug("XXXXXXX nextUpdateDelay in: " + nextUpdateDelay); - // don't wait if we're sFinished - if (sFinished) - break; + // don't wait if we're sFinished + if (sFinished) + break; - try { - if (nextUpdateDelay > 0) { - // wait the given ms - wait(nextUpdateDelay); - } else if (nextUpdateDelay == -1) { - // wait until we're notified; there are no - // characters. - wait(); - } - } catch (Exception e) { } - } + try { + if (nextUpdateDelay > 0) { + // wait the given ms + wait(nextUpdateDelay); + } else if (nextUpdateDelay == -1) { + // wait until we're notified; there are no + // characters. + wait(); + } + } catch (Exception e) { } } mRunning = false;