본문 바로가기
[개발 일지]

[2020.10.25] '당신이 잠든 사이에' 오류&버그 수정 업데이트

by Hevton 2020. 10. 26.
반응형

플레이스토어 보고서에 가보니.. 비정상 종료 횟수가 눈에띄게 많이 늘어났다. 그 부분은 바로

'IndexOutOfBoundsException' 예외였다. 이 부분이 사용자분들의 비정상 종료를 꽤 많이 초래했다..ㅜㅜ..

 

● IndexOutOfBoundsException

 

말그대로 배열같은 자료구조에서 자신의 사이즈보다 큰 인덱스, 즉 가지고 있지 않은 인덱스를 참조했을 때 생기는 에러다.

나는 솔직히 내 앱에서 해당 문제가 왜 일어나고 있는지 코드를 봐도 깨달을 수가 없었다. 그리고 직접 비정상종료를 경험해 본 적이 없기 때문에 어떤 문제인지에 대한 자세한 디버깅 정보도 얻어내기가 힘든 상황이다. 그래서 검색을 두세시간 했다. 해당 예외에 대해 검색만 두세시간 하면서 다른 사람들이 겪은 경우를 모조리 찾아봤다. 그리고 내 앱에도 적용해봤다... 그러다 결국 찾아낼 수 있었는데, 문제는 바로 'getView에서 인덱스를 불러들이고 있는 그 순간에 원본 데이터가 변경되었을 때' 오류가 생긴다. getView는 처음에 화면의 크기에 맞게 호출되고, 상황에 따라 적절하게 호출되는 함수이다. 원본 데이터가 50개라고 해서 getView가 처음부터 50번 호출되는 것이 아니라, 화면에 보이는 만큼만 호출되었다가 화면에 보이기 시작하면 그때 더 호출한다. 즉 앱목록을 스크롤링했을때 getView가 정말 빠른속도로 호출되기 시작하는데, 이 때 원본 데이터가 변경된다면(대표적으로 삭제) getView에서는 없는 인덱스를 참조하게된다. 아무리 getCount()에 원본데이터 크기만큼 잘 리턴을 시켜도 생기는 문제인 것이다.(나도 그랬기 때문에 뭐가 문제인지 처음에 몰랐던 것..)

 

그래서 해당 문제에 대해 다양한 방법을 생각했고, 가장 좋은 방법은 Adapter에서 참조하는 데이터에 대한 변경이 필요할 때엔

원본데이터를 직접 수정하지 말고, 새로운 임시 데이터를 만들어놨다가 거기에 해당되는 데이터들을 원본데이터에서 복사해서 추가한 뒤, 원본데이터에 다시 이 임시 데이터를 넣어주며 곧바로 notifyDataSetChanged()를 호출해주면 된다.

(이게 올바른 방법이지만 나는 수정해야 할 코드들이 너무나도 많아져버려서.. 다른방법을 이용했다)

 

업데이트 완료.. 그리고 또 업데이트할게 생각나서 또 할 예정...!ㅜ.ㅜ 공부도 해야하는데

반응형