how to avoid ConcurrentModificationException when threads add elements to the UI

14 views
Skip to first unread message

Thomas

unread,
Aug 12, 2018, 12:12:39 AM8/12/18
to CodenameOne Discussions
I have some threads that perform networker requests and then create ui elements based on the results of these request.
These elements (markers) are then added to a map. But at this point the app sometimes crash with a ConcurrentModificationException.
The function in my threads that is called to add elements (markers) to the map is inside a 
```
Display.getInstance().callSerially(new Runnable() {

}
```
block. I thought it was how we are supposed to "resync" results of some threads with the EDT one but it doesn't seem to work as I expected as the MapLayout is sometimes returning a ConcurrentModificationException when performing the layout (probably because some threads are adding markers components when the EDT is trying to perform the layout)
So how can I safelly add components to a container (a map) from multiple non EDT threads?
Thanks 
 

Device: android

Shai Almog

unread,
Aug 12, 2018, 12:36:21 AM8/12/18
to CodenameOne Discussions
callSerially() should work. I'm guessing the map does some weird things to synchronize with the native layer when manipulating the markers. Do you have the stack trace of the concurrent modification exception?

Thomas

unread,
Aug 12, 2018, 11:09:55 AM8/12/18
to CodenameOne Discussions
D/MyApplication(24672): [EDT] 0:0:13,103 - Exception: java.util.ConcurrentModificationException - null
W/System.err(24672): java.util.ConcurrentModificationException
W/System.err(24672):    at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
W/System.err(24672):    at org.tbdlab.myapp.ui.components.map.MapLayout.layoutContainer(MapLayout.java:83)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternalImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternalImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternalImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternalImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternalImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternalImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternalImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.impl.CodenameOneImplementation.paintDirty(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.edtLoopImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.impl.android.AndroidImplementation.runOnUiThreadAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsImpl.calcScreenPosition(InternalNativeMapsImpl.java:1315)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsStub.calcScreenPosition(InternalNativeMapsStub.java:253)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1520)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1530)
W/System.err(24672):    at org.tbdlab.myapp.ui.components.map.MapLayout.layoutContainer(MapLayout.java:87)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternalImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.impl.CodenameOneImplementation.paintDirty(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.edtLoopImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.impl.android.AndroidImplementation.runOnUiThreadAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsImpl.calcScreenPosition(InternalNativeMapsImpl.java:1315)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsStub.calcScreenPosition(InternalNativeMapsStub.java:253)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1520)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1530)
W/System.err(24672):    at org.tbdlab.myapp.ui.components.map.MapLayout.layoutContainer(MapLayout.java:87)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternalImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.impl.CodenameOneImplementation.paintDirty(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.edtLoopImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.impl.android.AndroidImplementation.runOnUiThreadAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsImpl.calcScreenPosition(InternalNativeMapsImpl.java:1315)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsStub.calcScreenPosition(InternalNativeMapsStub.java:253)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1520)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1530)
W/System.err(24672):    at org.tbdlab.myapp.ui.components.map.MapLayout.layoutContainer(MapLayout.java:87)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternalImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.impl.CodenameOneImplementation.paintDirty(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.edtLoopImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.impl.android.AndroidImplementation.runOnUiThreadAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsImpl.calcLatLongPosition(InternalNativeMapsImpl.java:1331)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsStub.calcLatLongPosition(InternalNativeMapsStub.java:265)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getCoordAtPosition(MapContainer.java:1477)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getBoundingBox(MapContainer.java:1365)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinates(MapContainer.java:1542)
W/System.err(24672):    at com.codename1.googlemaps.MapLayout$1.run(MapLayout.java:313)
W/System.err(24672):    at com.codename1.ui.Display.processSerialCalls(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.edtLoopImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.impl.android.AndroidImplementation.runOnUiThreadAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsImpl.calcScreenPosition(InternalNativeMapsImpl.java:1315)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsStub.calcScreenPosition(InternalNativeMapsStub.java:253)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1520)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1530)
W/System.err(24672):    at org.tbdlab.myapp.ui.components.map.MapLayout.layoutContainer(MapLayout.java:87)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternalImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.impl.CodenameOneImplementation.paintDirty(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.edtLoopImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.impl.android.AndroidImplementation.runOnUiThreadAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsImpl.calcScreenPosition(InternalNativeMapsImpl.java:1315)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsStub.calcScreenPosition(InternalNativeMapsStub.java:253)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1520)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1530)
W/System.err(24672):    at org.tbdlab.myapp.ui.components.map.MapLayout.layoutContainer(MapLayout.java:87)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternalImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.impl.CodenameOneImplementation.paintDirty(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.edtLoopImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.impl.android.AndroidImplementation.runOnUiThreadAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsImpl.calcLatLongPosition(InternalNativeMapsImpl.java:1331)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsStub.calcLatLongPosition(InternalNativeMapsStub.java:265)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getCoordAtPosition(MapContainer.java:1477)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getBoundingBox(MapContainer.java:1366)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinates(MapContainer.java:1542)
W/System.err(24672):    at com.codename1.googlemaps.MapLayout$1.run(MapLayout.java:313)
W/System.err(24672):    at com.codename1.ui.Display.processSerialCalls(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.edtLoopImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.impl.android.AndroidImplementation.runOnUiThreadAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsImpl.calcScreenPosition(InternalNativeMapsImpl.java:1315)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsStub.calcScreenPosition(InternalNativeMapsStub.java:253)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1520)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1530)
W/System.err(24672):    at org.tbdlab.myapp.ui.components.map.MapLayout.layoutContainer(MapLayout.java:87)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.paint(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Form.internalPaintImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternalImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintInternal(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Component.paintComponent(Unknown Source)
W/System.err(24672):    at com.codename1.impl.CodenameOneImplementation.paintDirty(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.edtLoopImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.invokeAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.impl.android.AndroidImplementation.runOnUiThreadAndBlock(Unknown Source)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsImpl.calcScreenPosition(InternalNativeMapsImpl.java:1315)
W/System.err(24672):    at com.codename1.googlemaps.InternalNativeMapsStub.calcScreenPosition(InternalNativeMapsStub.java:253)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1520)
W/System.err(24672):    at com.codename1.googlemaps.MapContainer.getScreenCoordinate(MapContainer.java:1530)
W/System.err(24672):    at org.tbdlab.myapp.ui.components.map.MapLayout.layoutContainer(MapLayout.java:87)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.doLayout(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.layoutContainer(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Container.revalidate(Unknown Source)
W/System.err(24672):    at org.tbdlab.myapp.ui.components.map.MapLayout$1.run(MapLayout.java:180)
W/System.err(24672):    at com.codename1.ui.Display.processSerialCalls(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.edtLoopImpl(Unknown Source)
W/System.err(24672):    at com.codename1.ui.Display.mainEDTLoop(Unknown Source)
W/System.err(24672):    at com.codename1.ui.RunnableWrapper.run(Unknown Source)
W/System.err(24672):    at com.codename1.impl.CodenameOneThread$1.run(Unknown Source)
W/System.err(24672):    at java.lang.Thread.run(Thread.java:818)

Shai Almog

unread,
Aug 13, 2018, 12:31:54 AM8/13/18
to CodenameOne Discussions
You will notice in the stack trace several calls to calcScreenPosition which trigger native synchronous calls and effectively call a deep nest of invokeAndBlock.
What happens is this:

- You ask for screen coordinates
- Map cn1lib goes into Android and asks for this but because this needs to run on the native android thread it uses invokeAndBlock to wait for the Android native thread
- Android takes a while to complete the answer
- While Android is taking its time you ask for screen coordinates again and again...

This ends up nesting invoke and block calls which creates problems after some depth. It's a powerful tool but it's meant for coarse things not things you do often. I'm not sure if the current maps have an asynchronous version of the API but if it does you need to use that API. If not we'll need to add such an API.

Thomas

unread,
Aug 13, 2018, 12:47:56 AM8/13/18
to CodenameOne Discussions
I don't think that the current cn1 native map implementation has an asynchronous version of functions for transforming screen position from/to geo position.
Anyway, there is something I am not sure to understand in how CN1 invokeAndBlock works. I thought that with an invokeAndBlock call, the whole app process was paused until what is in the block complete (so if it is a call to a native android call like here, it will wait for android to answer befor pursuing). So how can this result into nested mutiple invokeAndBlock calls? once the first  invokeAndBlock call is called (by the calcScreenPosition of the first marker of the map), wouldn't the process wait for the android answer before pursuing to the next calcScreenPosition (for the next marker) that will be processed with an invokeAndBlock too, that should block any further line of code /loop step to be executed until android answer and so on...?

Steve Hannah

unread,
Aug 13, 2018, 8:33:08 AM8/13/18
to codenameone...@googlegroups.com
One way to resolve this problem by making your MapLayout's layoutContainer() method resilient to re-entry.

E.g.

private boolean inLayout;

public void layoutContainer(Container c) {
     if (inLayout) {
        return;
     }
     inLayout = true;
     try {
          ... the current body of your layoutContainer method
     } finally {
           inLayout = false;
     }
    
}


I'll likely make a similar change to ours.

--
You received this message because you are subscribed to the Google Groups "CodenameOne Discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email to codenameone-discussions+unsub...@googlegroups.com.
Visit this group at https://groups.google.com/group/codenameone-discussions.
To view this discussion on the web visit https://groups.google.com/d/msgid/codenameone-discussions/5f472865-69b7-4c70-b54f-c37ec89147ca%40googlegroups.com.

For more options, visit https://groups.google.com/d/optout.



--
Steve Hannah
Software Developer
Codename One
Reply all
Reply to author
Forward
0 new messages