Hi, Peter, Actually, if you look my code, I have a global array of overlay item. And I override following code:
public int size() { return mFriendList.size(); } public LptOverlayItem createItem(int i) { return mFriendList.get(i); } --elephantbug On Sep 24, 10:56 pm, Peter Stevenson <[EMAIL PROTECTED]> wrote: > Hi > > this can be trigger by not create OverlayItem > > //customizedItemizedOverlay > protected class FriendOverLay extendsItemizedOverlay<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); > > } > > > }); > > > } > > } > > } > > > //customizedItemizedOverlay > > protected class FriendOverLay extendsItemizedOverlay<OverlayItem> > > { > > public FriendOverLay(Drawable marker) { > > super(marker); > > > populateFriends(); > > } > > > public synchronized void populateFriends() > > { > > mFriendList = > > DataManager.getInstance().getFriendLocations(); > > super.populate(); > > } > > > [EMAIL PROTECTED] > > 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 theItemizedOverlay.draw() method. > > > So basically, my question is how to achieve one screen display the > > dynamic data onItemizedOverlay? > > > 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 anItemizedOverlaywhich 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 makesItemizedOverlaythrow ArrayOutofIndex > >>> exceptionrom getIndexToDraw() method. > > >>> Anyone can help me why it might happen and what is the best practice > >>> to support dynamic data bind forItemizedOverlay? > > >> Without seeing your implementation of yourItemizedOverlaysubclass, 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 theItemizedOverlay, I cannot make any particular suggestions of > >> how to get around this problem. What *may* work is to change the > >> contents of yourItemizedOverlayonly 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 -~----------~----~----~----~------~----~------~--~---