[android] java.util.ConcurrentModificationException

ArrayList<String> listeners = new ArrayList<>();
for (int i = 0; i < 100; i++) {
  listeners.add("" + i);
}

for (String s : listeners) {
  Log.i("MainActivity : onCreate", "|" + s);

  if (s.equals("10")) {
    listeners.remove(10);
  }
}

 

java.util.ConcurrentModificationException
  at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
  at android.view.View.performClick(View.java:5198)
  at android.view.View$PerformClick.run(View.java:21147)
  at android.os.Handler.handleCallback(Handler.java:739)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:148)
  at android.app.ActivityThread.main(ActivityThread.java:5417)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

loop를 돌고 있는 list에 변경을 가할 때 생긴다.

 

for (String s : new ArrayList<>(listeners))

이런 식으로 바꿔주니까 괜찮아진다.

 

혹은

CopyOnWriteArrayList<String> listeners = new CopyOnWriteArrayList<>();

로 바꿔도 된다.(도움 받은 곳 : http://aroundck.tistory.com/867 )

 

그것도 아니면

Observable.from(listeners).subscribe(l -> {
  if (l.equals("10")) {
    listeners.remove(10);
  }
});

RxJava 를 이용하는 법도 있다.(안드로이드는 RxAndroid)