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

Popular posts from this blog

Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12:test (default-test) on project.Error occurred in starting fork -

windows - Debug iNetMgr.exe unhandle exception System.Management.Automation.CmdletInvocationException -

unity3d - Fatal error- Monodevelop-Unity failed to start -