Hi!

It's not clear where your code is located and called. If it's in the
thread which receives the messages, than you're modifying UI elements
from another thread which is really bad.

If your code is in the activity object, and you call it directly from
the network thread, than you also execute code in a thread which is
not the UI thread (very bad again), and therefore if the Overlay is
currently drawn and at that moment you receive a new message you will
try to modify a List while it is accessed by another thread (the UI).

There is already a facility in the android api which can help you put
your data into the UI thread in a safe way.

See: http://developer.android.com/reference/android/os/Handler.html

Heres a simple example using Handler.post()

In you activity where your UI components are. Create a Handler object,
(eg: mHandler = new Handler())

Pass this mHandler object to your network thread. When your network
thread receives a message use this handler to send a Runnable object
to be executed in the UI thread. Eg:

receiveMessage(String msg) {
    // send a runnable to execution in the thread which created the
handler
    mHandler.post(new Runnable() { // implement the Runnable interface
            public void run() {
                activity.updateUI();  // <- what to call in the
handler thread.
            }
        });
}

If your thread is implemented as an inner class of your activity, you
can call the necessary method directly in the Runnable.run method.

I hope this helps.

   Zsolt.

On Aug 27, 12:41 pm, Lex <hakkinen1...@gmail.com> wrote:
> This post is in addition 
> to:http://groups.google.com/group/android-developers/browse_thread/threa...
>
> I have exactly the same problem and Doug pinpointed what's probably
> the issue in my case exactly:
>
> So here's the deal: I have a Vector containing traffic messages
> (received from a server via UDP in an own thread). Each time a message
> is received, I create a new overlay object and populate it with the
> traffic messages:
>
> public void receiveMessage(BinaryMessage binaryMsg) {
>
>                 ....
>              TrafficMessage message = createMessage(binaryMsg);
>              // adds message to vector
>              addTrafficMessage(message,
> CoCarMapView.trafficMessages);
>              CoCarMapView.showTrafficMessages();
>                                 ....
>
> }
>
> public static void showTrafficMessages() {
>                 List<Overlay> overlays = mapView.getOverlays();
>                 if (overlays.size() > 1) {
>                         overlays.remove(1);
>                 }
>                 Drawable warningIcon = context.getResources().getDrawable
> (R.drawable.sign_warning_small);
>                 CoCarItemizedOverlay trafficEventsOverlay = new 
> CoCarItemizedOverlay
> (warningIcon);
>
>                 // the overlay is populated here
>                 trafficEventsOverlay.updateOverlay(trafficMessages);
>
>                 mapView.getOverlays().add(trafficEventsOverlay);
>                 mapView.postInvalidate();
>
> }
>
> public void updateOverlay(Vector<TrafficMessage> messages) {
>                 for(int i=0; i < messages.size(); i++) {
>
>                         TrafficMessage message = messages.elementAt(i);
>                         Drawable messageIcon = getMessageIcon(message);
>                         GeoPoint point = getGeoPoint(message);
>                         OverlayItem messageItem = createItem(messageIcon, 
> point);
>                         this.addItem(messageItem);
>
>                 }
>
> }
>
> I don't understand yet exactly where the error is caused, that is
> where to start improving stuff...
>
> Thanks for your advice,
>
> Lex
--~--~---------~--~----~------------~-------~--~----~
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
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to