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); } });