I have two ListFragments
and 6 views all set with onDragListeners
. If a user drags one of these 6 views onto the ActionBar
, a ConcurrentModificationException
is thrown. This is because I have set each of these 6 views to listen for DragEvent.ACTION_DRAG_ENDED
and if event.getResult()
is false, it will attempt to make that view visible:
public static boolean isFirstModify = true;
public boolean onDrag(View v, DragEvent event) {
View view = (View) event.getLocalState();
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_ENDED:
if (!event.getResult()) {
synchronized (view) {
if (isFirstModify) {
isFirstModify = false;
view.setVisibility(View.VISIBLE);
}
}
}
break;
}
}
As of current, isFirstModify
is never set back to true and the above code still throws a ConcurrentModificationException
. So, I was wondering why the above code throws the exception? Possibly is each listener's response running on the same thread?
I get the ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry
, so, possibly the exception is thrown due to editing the view while another thread is iterating over it. The only issue with this is theory is that when only one listener sets the view to visible, no exception is thrown. Likewise, I was having trouble getting only one entity to modify the view because there are 2 ListFragments
attached to a listener class and 6 other Views attached to another listener class, and only these two class listeners call DragEvent.ACTION_DRAG_ENDED
upon dropping of the view.
So, I see two possible solutions that I haven't been able to get working yet.
1. once one listener modifies the view, block the other listeners from modifying the view or
2. only call one listener to modify the view.
Edit: full error stack message:
FATAL EXCEPTION: main Process: com.example.travisho.dragdropui3, PID: 13599 java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(HashMap.java:806) at java.util.HashMap$KeyIterator.next(HashMap.java:833) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1189) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1191) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1191) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1191) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1191) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1191) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1191) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1191) at android.view.ViewRootImpl.handleDragEvent(ViewRootImpl.java:5032) at android.view.ViewRootImpl.access$800(ViewRootImpl.java:105) at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3266) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5086) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method)