concurrentmodification - Android: ConcurrentModificationException persisting -
i have 2 lists suggestedfriends
, allsuggestedfriends
.
i use iterator run through first list , remove items list. on way, items should removed second list if still has items in it. use second iterator (in saferemove method) removing items second list.
problem: concurrentmodificationexception in line if (allsuggestedfriends.size() > 0) {
though use iterators propose of removing items.
should use iterator ask size? don't think it's possible(?!)
synchronized (suggestedfriends) { (final iterator<user> suggestedfriendsiterator = suggestedfriends.iterator(); suggestedfriendsiterator.hasnext();) { user friend = suggestedfriendsiterator.next(); if (friend.userid == request.getuserid()) { final int index = suggestedfriends.indexof(friend); if (status) { ((fragmentactivityext) context).runonuithread(new runnable() { @override public void run() { if(suggestedfriends.size() > 0) { suggestedfriendsiterator.remove(); } notifydatasetchanged(); if (allsuggestedfriends.size() > 0) { suggestedfriends.add(2, allsuggestedfriends.get(0)); saferemove(allsuggestedfriends, allsuggestedfriends.get(0)); notifydatasetchanged(); } if (suggestedfriends.size() == 1) { // fixme workaround fix list height wrap_content not supported recyclerview @ moment //set fit 1 element linearlayout.layoutparams params = (linearlayout.layoutparams) mlistview.getlayoutparams(); params.height = endoutility.dptopx(context, 70); mlistview.setlayoutparams(params); } if (suggestedfriends.size() == 0) { eventbus.getdefault().post(new nomoresuggestedfriendsevent()); } } }); } else { if (mlistview != null) { ((fragmentactivityext) context).runonuithread(new runnable() { @override public void run() { toast.maketext(context, r.string.networkproblemtoast, toast.length_long).show(); ((suggestedfriendview) mlistview.getchildat(index)).reset(); } }); } } break; } } }
the saferemove method using second iterator:
private void saferemove(list<user> list, user friend) { iterator<user> iter = list.iterator(); while (iter.hasnext()) { user user = iter.next(); if (user.userid == friend.userid) iter.remove(); } }
update:
would solution add synchronized
around saferemove(allsuggestedfriends, allsuggestedfriends.get(0));
line? that:
... synchronized (allsuggestedfriends) { saferemove(allsuggestedfriends, allsuggestedfriends.get(0)); } ...
or better yet, inside saferemove method? that:
private void saferemove(list<user> list, user friend) { synchronized (list) { iterator<user> iter = list.iterator(); while (iter.hasnext()) { user user = iter.next(); if (user.userid == friend.userid) iter.remove(); } } }
well, question marked potential duplicate, didn't responses ever. unfortunate since i'm quite case in discussion different suggested link.
nevertheless, didn't use synchronized
implemented keyword (as myself suggested in update), implemented parallel counter sat lists size when list finished loading, , decrements when items removed list. eliminates allsuggestedfriends.size()
check concurrentmodificationexception
occurred.
... private int allsuggestedfriendscount; ... // allsuggestedfriends loads items ... allsuggestedfriendscount = allsuggestedfriends.size(); ... ... if (allsuggestedfriendscount > 0) { suggestedfriends.add(2, allsuggestedfriends.get(0)); saferemove(allsuggestedfriends, allsuggestedfriends.get(0)); notifydatasetchanged(); } ... private void saferemove(list<user> list, user friend) { iterator<user> iter = list.iterator(); while (iter.hasnext()) { user user = iter.next(); if (user.userid == friend.userid) { iter.remove(); allsuggestedfriendscount--; } } }
Comments
Post a Comment