Hi, Mark, Here is the code snip: ---------------------------------------------- Main Map Screen ----------------------------------------------- public class MyMapActivity extends MapActivity implements Observer{
//global array of overlay items List<OverlayItem> mFriendList = Collections.synchronizedList(new ArrayList<OverlayItem>()); public void onCreate(){ //init...(omit) ... //add itemized overlay myOverLay = new FriendOverLay(marker); mMapView.getOverlays().add(myOverLay); //...} //observer public void update(Observable o, Object args) { if(args instanceof Byte) { Byte event = (Byte)args; if(event == EVENT_UPDATES) { // try to refresh the screen runOnUiThread( new Runnable() { public void run() { if(myOverLay != null) { myOverLay.populateFriends(); } if(mMapView != null) mMapView.postInvalidateDelayed(5000); } }); } } } //customized ItemizedOverlay protected class FriendOverLay extends ItemizedOverlay<OverlayItem> { public FriendOverLay(Drawable marker) { super(marker); populateFriends(); } public synchronized void populateFriends() { mFriendList = DataManager.getInstance().getFriendLocations(); super.populate(); } @Override public void draw(Canvas canvas, MapView view, boolean shadow ) { super.draw(canvas, view, shadow); boundCenterBottom(marker); //draw other stuffs... } } } ----------------------------- The data manager ----------------------------- public class DataManager extends Observable{ private List<OverlayItem> friendStatus = Collections.synchronizedList(new ArrayList<OverlayItem>()); public List<OverlayItem> getFriendLocations() { synchronized (friendAccessMutex) { return friendStatus; } } //will spawn a new thread to update the friendStaus array periodically.and call setChange and notify the Map Screen (trigger update())... } ----------------------------------------------------------------------- Most of time, it works fine. But sometimes ( I have not found the pattern yet), it will trigger ArrayOutOfIndexException on the ItemizedOverlay.draw() method. So basically, my question is how to achieve one screen display the dynamic data on ItemizedOverlay? Any input is appreciated. Thanks. --elephantbug On Sep 24, 6:34 pm, Mark Murphy <[EMAIL PROTECTED]> wrote: > elephantbug wrote: > > I extend the MapActivity and have an ItemizedOverlay which will > > display array of items(For example, people) on top of MapView. These > > items' location are moving and some new items might be added in or > > some might be removed. There is another thread managing these items. > > > MapActivity is the observer of these items and update the UI whenever > > items changes. It works fine most of time. However, periodically, it > > will cause trouble and makes ItemizedOverlay throw ArrayOutofIndex > > exceptionrom getIndexToDraw() method. > > > Anyone can help me why it might happen and what is the best practice > > to support dynamic data bind for ItemizedOverlay? > > Without seeing your implementation of your ItemizedOverlay subclass, it > is difficult to make many suggestions. > > Bear in mind that if you change the data in a background thread, the > foreground (UI) thread might still be working off of old information. > For example, suppose you have six items, and the foreground thread is > busy drawing those six items on the map. While that is happening, your > background thread removes one item. The foreground thread has no way to > know that occurred, so it will try requesting the sixth item...and will > fail. > > Since I don't know how you are telling the MapView that there is changed > data in the ItemizedOverlay, I cannot make any particular suggestions of > how to get around this problem. What *may* work is to change the > contents of your ItemizedOverlay only on the foreground (UI) thread -- > just have the background thread use a Handler or use runOnUiThread() or > something to arrange for the work to get done on the foreground thread. > > -- > Mark Murphy (a Commons Guy)http://commonsware.com > _The Busy Coder's Guide to Android Development_ Version 1.2 Published! --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---