얼마 전까지만 해도 운영 중인 앱에서 종종 터치 입력이 씹히는 문제가 발생하고 있었다.
사실 스토어에 출시까지 진행된 앱에서 터치 입력이 씹힌다는 어마 무시한 문제가 존재한다는 게 말이 안 되지만, 이제야라도 이 문제를 해결해서 그나마 다행이라 생각을 한다.
그리고 혹시 나와 비슷한 이유로 터치 입력이 씹히는 문제를 겪고 계신 분이 있다면, 도움이 될 수 있지 않을까 하는 마음으로 포스팅을 시작한다.
주기적으로 서버에서 데이터를 받아오고, 받아온 데이터를 사용하여 특정 작업을 수행하고, 이를 UI에 반영한다.
여기에는 한 가지 큰 문제점이 존재하는데, 바로 UI Thread에서 특정 작업을 수행한다는 것이다.
UI Thread는 터치 입력과 같은 사용자의 입력이 들어왔을 때, 그 입력에 대하여 반응을 바로바로 수행할 수 있어야 한다.
하지만 내 앱은 UI Thread에서 "특정 작업"을 수행하거나, 수행 결과를 UI에 반영하는 동안에 사용자의 입력이 발생할 경우, UI Thread가 다른 작업을 수행하고 있기 때문에 이 입력은 무시된다.
물론 이를 몰랐던 것은 아니지만, 앱을 출시할 당시에는 "특정 작업"이 for loop 20번 정도 돌아가면 끝이었기 때문에 별문제가 없었고, 업데이트 전까지 이런 문제가 있었다는 것을 깜빡하고 있었다.
하지만 이전에 앱을 업데이트하면서 "특정 작업"의 for loop 수행 횟수도 증가했을뿐더러, 기타 작업이 추가되었기 때문에, 그때부터는 무시할 수 없는 수행 시간이 되어버렸다.
처음에는 RecyclerView
를 업데이트할 때, notifyDataSetChanged()
를 사용했었다.
그래서 터치 입력이 씹히는 이유가 notifyDataSetChanged()
를 너무 자주 호출하기 때문이라고 생각했었다.
왜냐하면 notifyDataSetChanged()
는 안드로이드 공식 문서에 나와있듯이, RecyclerView
를 다시 그리기 때문에, 비용이 상당히 큰 함수이기 때문이다.
따라서 notifyDataSetChanged()
를 notifyItemRangeChanged()
로 수정해 봤지만, 문제는 여전히 발생했다.
UI Thread에서 수행하던 "특정 작업"을 새로운 Background Thread에서 수행하도록 수정했다.
그 결과, 터치 입력이 무시되던 문제는 더 이상 발생하지 않게 되었다.
앱을 빨리 출시하고 싶은 마음과, 새로운 기능을 빨리 추가하고 싶은 마음에 이전까지는 개발 속도에 집중해서 개발을 했었다.
그 결과, 내 앱의 기술 부채가 상당한 양이 되어버렸다.
물론 다른 개발자분들께서 이런 기술 부채를 해결하는 과정에서 많이 성장할 수 있다고 하셨기에, 할 수 있는 만큼 최선을 다해서 앱을 운영해나갈 계획이다.