As far as I can tell from the source, this shouldn't be happening with all the synchronization added to EventManager, yet here's the call stack:
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): main java.util.ConcurrentModificationException
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:350)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.util.LinkedHashMap$KeyIterator.next(LinkedHashMap.java:370)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at roboguice.event.EventManager.fire(EventManager.java:129)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at XXX.XXX.XXX.ui.GetMemberDetailsTask.onSuccess(GetMemberDetailsTask.java:38)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at XXX.XXX.XXX.ui.GetMemberDetailsTask.onSuccess(GetMemberDetailsTask.java:1)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at roboguice.util.SafeAsyncTask$Task$2.call(SafeAsyncTask.java:210)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at roboguice.util.SafeAsyncTask$Task$6.run(SafeAsyncTask.java:275)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.os.Handler.handleCallback(Handler.java:615)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.os.Handler.dispatchMessage(Handler.java:92)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.os.Looper.loop(Looper.java:137)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.ActivityThread.main(ActivityThread.java:4745)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.lang.reflect.Method.invokeNative(Native Method)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.lang.reflect.Method.invoke(Method.java:511)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at dalvik.system.NativeStart.main(Native Method)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at dalvik.system.VMStack.getThreadStackTrace(Native Method)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.lang.Thread.getStackTrace(Thread.java:591)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at roboguice.util.SafeAsyncTask.execute(SafeAsyncTask.java:90)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at XXX.XXX.XXX.ui.PassEntryFragment.onActivityResult(PassEntryFragment.java:72)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:153)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at com.github.rtyley.android.sherlock.roboguice.activity.RoboSherlockFragmentActivity.onActivityResult(RoboSherlockFragmentActivity.java:106)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.Activity.dispatchActivityResult(Activity.java:5192)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.ActivityThread.deliverResults(ActivityThread.java:3137)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3184)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.ActivityThread.access$1100(ActivityThread.java:130)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.os.Handler.dispatchMessage(Handler.java:99)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.os.Looper.loop(Looper.java:137)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at android.app.ActivityThread.main(ActivityThread.java:4745)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.lang.reflect.Method.invokeNative(Native Method)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at java.lang.reflect.Method.invoke(Method.java:511)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/XXX.XXX.XXX/GetMemberDetailsTask.java:64(20855): at dalvik.system.NativeStart.main(Native Method)
I have an onActivityResult executing a new RoboAsyncTask. In the Task's onSuccess, in fires an event via the EventManager. This event is captured in a couple places: the activity, and the four fragments that are part of the ViewPager in the activity. Here's the sequence of events:
* The event is fired in the onSuccess, probably reaches the activity first, which then flips to the second page of the ViewPager.
* The second page's Fragment is then created along with its View. Since the Fragment also handles the event which is currently being fired, I assume when the View is created, the event handler is registered with the EventManager.
* The event manager tries to get the next object to notify of the event and Boom; ConcurrentModificationException.
As far as I can tell from looking at the EventManager code, the event firing is in a synchronized block, and the collection of observers is a synchronized Set. I have not gotten around to debugging the issue since I need to get caught up on how to get RG's maven build in Eclipse.