⛔ 문제사항
fakeDataList.forEachIndexed { idx, itm ->
if (idx == position) {
fakeDataList.removeAt(idx)
mainAdapter.notifyItemChanged(idx)
}
}
forEachIndexed를 통해 List 안의 값을 삭제하려고 했는데, 이 코드가 동작하기만 하면 앱이 강제 종료 되며 java.util.ConcurrentModificationException 과 같은 에러가 나타났다.
✅ 해결방안
원인은 List나 Map과 같은 컬렉션을 수정하는 도중에 다른 스레드에서 동시에 컬렉션을 수정하려고 해서 그러는 것인데, 쉽게 말하자면 List는 수정되었는데 수정되기 이전의 List에서 forEach가 계속 수행 되고 있기 때문이다. 같은 값을 다른 스레드에서 동시에 수행하고 있는 것이다.
for ((idx, itm) in fakeDataList.withIndex()) {
if (idx == position) {
fakeDataList.removeAt(idx)
this@MainActivity.runOnUiThread {
mainAdapter.notifyItemRemoved(idx)
}
break
}
}
때문에 직접 for문을 돌려 원하는 타이밍에 break 해줄 수 있도록 하면 쉽게 해결된다.
단순 조회할 때는 forEach가 유용할 순 있어도 수정삭제 작업이 필요하다면 for문을 돌려야한다. 이렇게 같은 반복문이어도 동작의 차이를 이해하다니~ 성장했다.
❗출처
참고 사이트 : https://green-bin.tistory.com/111
'Android > 문제해결' 카테고리의 다른 글
문제해결 : Unresolved reference: BuildConfig (0) | 2024.08.01 |
---|---|
문제해결 : Val cannot be reassigned (0) | 2024.07.29 |
문제해결 : java.lang.NullPointerException: Missing required view with ID (0) | 2024.07.23 |
문제해결 : Hardcoded string "", should use @string resource (0) | 2024.06.18 |
문제해결 : kotlin.NotImplementedError: An operation is not implemented: Not yet implemented (0) | 2024.05.29 |