Hi
this can be trigger by not create OverlayItem //customized ItemizedOverlay protected class FriendOverLay extends ItemizedOverlay<OverlayItem> private List<OverlayItem> mItemList = new ArrayList<OverlayItem>(); { public FriendOverLay(Drawable marker) { super(marker); *mItemList.add(new OverlayItem(whatAroundMe.currentPoint , "Title", "Snippet"));* 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... } } } [EMAIL PROTECTED] protected OverlayItem createItem(int i) { return mItemList.get(i); } @Override public int size() { return mItemList.size(); }* hope it helps Peter elephantbug wrote: > 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 -~----------~----~----~----~------~----~------~--~---