티스토리 뷰

Android

Inconsistency detected 에러에 대한 의심..

갈치참치꽁치멸치 2020. 1. 11. 18:06

SwipeRefreshLayout을 이용하여 RecyclerView를 새로고침 하는 기능을 만들고 있었다.

평상시에는 정상적으로 작동하는듯 하는데 간헐적으로 아래와 같은 에러가 발생하며 앱이 종료되었다.

 

java.lang.IndexOutOfBoundsException: Inconsistency detected.

 

불일치가 감지되었다고 하는데 무슨 에러일까?

 

데이터 변경에 대한 범위를 정상적으로 지정해주지 않았을 때 발생해야 하는 에러인 것으로 추정된다.

나는 정상적으로 지정해준거같은데.. Inconsistency detected 에러가 발생하는 것을 보아 고민을 해본 결과

notifyItemRangeChanged(position, size)가 실행되는 동안 새로고침으로 또 데이터를 notifyItemRangeChanged()로 변경해서 갱신 이상같은 문제가 발생하는 것으로 생각된다.

 

데이터가 삽입이 완료될 때 까지 다른 갱신활동을 하지 못하게 된다면 해당 에러는 발생하지 않을 것 같은데..

 

우선 나는 새로고침 할 때 데이터 전체를 갱신할 것이었기 때문에

notifyItemRangeChanged()를 사용하지 않고 notifyDataSetChanged()를 사용하여 범위 갱신이 아닌 전체 갱신으로 문제를 회피했다.

 

fun refreshList(items: List) {
        list.clear()
        list += items
        notifyDataSetChanged()

}

 

그러던 중 ListAdapter라는 것을 알게 되었는데, 기존 RecyclerView.Adapter와 다르게 AsyncListDiffer라는 것이 있었다. 이 것은 DiffUtil의 연산을 도운다고 되어져있는데 DiffUtil은 기존에 있던 리스트와 새로 삽입된 리스트를 서로 비교하고 변경사항이 있다면 내부적으로 notify하여 데이터를 변경한다.

따라서 ListAdapter를 사용하면 item을 하나씩 삽입, 삭제하지 않고 리스트 객체 전체를 새로 넣게된다. 이 것을 통해 데이터의 갱신 이상을 방지하는 것으로 생각된다.

 

지금은 전부 의심과 추측이지만.. 지금 일정이 끝나면 직접 다 실험해보기로 하자!

 

 

참고: https://developer.android.com/reference/androidx/recyclerview/widget/ListAdapter.html?hl=en

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함