본문 바로가기

전체 글

(103)
안드로이드에서 실시간으로 네트워크 상태를 대응해보자 서론 스마트폰에서 인터넷 연결이 끊기는 상황은 가장 흔하게 만날 수 있습니다. 저는 아이폰을 사용하고 있는데요, 아이폰은 연결 가능한 와이파이가 있다면 자동으로 연결해 주는 기능이 있습니다. 때로는 이 기능이 편하기도 하지만 연결 상태가 좋지 않은 와이파이에 연결될 경우 인터넷 사용이 불가능한 상황이 자주 일어납니다. 이렇듯 가장 흔하게 많이 일어나는 이슈인 만큼 앱에서 적절한 에러처리를 해줘야 합니다. 오늘은 다온길을 개발하면서 어떻게 네트워크 에러를  처리했는지 소개하겠습니다.실시간으로 네트워크 상태를 받아오자우선 기기의 현재 네트워크 연결 상태를 확인하기 위해서 Connectivity를 사용해야 합니다. 안드로이드에선 사용자에게 다양한 형태의 네트워크 작업을 할 수 있도록 Wi-Fi에 연결되었을 때..
안드로이드 접근성 개선기 서론 다온길 프로젝트는 무장애 여행을 제공하는 것을 목표로 몸이 불편하신 분들도 다온길을 통해 일반인들과 똑같이 여행할 수 있게 하는것을 목표로 하고있습니다. 이를 위한 가장 중요한 요소는 바로 접근성입니다. 오늘은 안드로이드에서 제공하는 다양한 접근성 도구들과 이를 활용해 저희 프로젝트의 접근성을 어떻게 향상시켰는지 알아보겠습니다.접근성 검사기를 사용해보자 접근성 검사기는 어플리케이션의 화면을 스캔하고 앱의 접근성을 개선하기 위한 제안을 제공하는 앱입니다. 콘텐츠 레이블, 클릭 가능한 항목, 대비 등을 검사하여 구체적인 개선 방안을 제시합니다. 가장 먼저 접근성 검사기를 실행하면 툴바 메뉴에 설정에서 접근성 검사에 사용될 텍스트와 이미지의 대비율, 터치할 대상 크기를 설정할 수 있습니다. 기존에 설정되..
안드로이드 리사이클러뷰 성능 개선 일지 4편 서론오늘은 3편에 이어 리사이클러뷰의 성능을 개선하기 위해 시도했던 다양한 방법들에 대해서 소개해볼까 합니다. 3편 마지막에 짧게 언급한 GPU 렌더링 프레임부터 시작해서 레이아웃 평탄화 등등 제가 시도한 과정들을 소개해드리고 결과를 한번 리뷰해보겠습니다.1. 렌더링 측정 도구들에 대해 알아보자1.1 프로필 GPU 렌더링 안드로이드 스마트폰의 개발자 옵션에서 설정할 수 있는 프로필 GPU 렌더링은 현재 화면에서 실행중인 어플리케이션의 렌더링 시간을 막대 형태로 보여줍니다. 각각의 수직 막대는 한 프레임인데 높이가 높을수록 렌더링에 오랜 시간이 소요됐음을 뜻합니다.  하단에 수평으로된 하나의 녹색선이 있습니다. 이 라인은 16.67ms를 나타냅니다. 초당 60 프레임이 되려면 이 수직 막대들이 16ms 라..
안드로이드 리사이클러뷰 성능 개선 일지 3편 서론오늘은 2편에서 알아본 DiffUtil을 사용해 프로젝트를 마이그레이션 해보겠습니다. 모든 작업이 완료된 시점에서 글을 작성하다 보니 결론부터 말하자면 DiffUtil을 사용함으로써 성능은 끌어올렸겠지만 UI/UX 측면에서 큰 이점을 끌어올리진 못했습니다. 그 이유는 DiffUtil의 특성상 데이터가 변경된 뷰홀더를 재바인딩 하면서 화면을 다시 그리게 됩니다. 이 과정에서 일반 사용자가 보기엔 화면이 깜빡이는 현상이 일어났습니다. 그래서 오늘은 DiffUtil 어떻게 적용했는지부터 시작해 왜 이런 현상이 발생하는지 알아보겠습니다.1. 필요한 데이터 클래스를 만들자 가장 먼저 할 일은 ListAdapter를 쉽게 사용할 수 있도록 RecyclerView.Adapter를 상속하고 있던 Adapter ..
안드로이드 리사이클러뷰 성능 개선 일지 2편(부제 : DiffUtil Deep Dive) 서론 이전 글에 이어서 이번엔 DiffUtil을 분석하고 내부 구현을 뜯어보겠습니다.1. 개발자만 편한 메소드리사이클러뷰에 아이템들을 교체하기 위한 가장 쉬운 방법은 notifyDataSetChanged( )였습니다. 리사이클러뷰의 데이터를 변경하기 위해 notifyDataSetChanged를 호출하면 리스트의 데이터를 전부 다시 그립니다. 극단적인 예시로 숫자를 0에서 1로 바꿔야 하는데 현재 1000개의 아이템이 있다고 하면 이 1000개의 아이템을 전부 다시 그리는 대참사가 발생합니다. 그리고 이번에 공부하면서 처음 안 사실인데 notifyDataSetChanged는 변경된 아이템의 애니메이션을 그릴 수 없다고 합니다. 공식 문서만 봐도 notifyDataSetChanged 소개 페이지가 Depr..
안드로이드 리사이클러뷰 성능 개선 일지 1편(부제: Recyclerview Deep Dive) 서론프로젝트를 진행하면서 서버에서 가져온 이미지와 덱스트 데이터를 리사이클러뷰로 화면을 스크롤할 때 버벅거림 현상이 일어났습니다. 이를 전문 용어로 Jank라고 하더군요. 그래서 이 부분에 대한 성능 개선을 진행하면서 경험했던 것들을 기록하려 합니다. 1. 리사이클러뷰의 구조를 분해 해보자가장 먼저 할 일은 사용하는 리사이클러뷰 API가 어떻게 동작하는지 다시 한번 리뷰해 보겠습니다. 조잡하지만(날 것의 맛...) 리사이클러뷰가 뷰를 재활용하는 과정을 그림으로 만들어봤습니다. 그림과 같이 리사이클러뷰는 그림에서 처럼 화면에서 보이던 뷰가 사용자의 스크롤로 인해 보이지 않게 될 경우, 아래쪽에 새로 나타날 뷰 위치로 객체를 이동시킵니다. 리사이클러뷰란 이름에서 그대로 뷰를 재활용합니다. 즉, 실제 데이터가..
Kotlin Coroutine Continuation 👩‍💻 오늘의 할 일오늘은 코루틴을 사용할 때 빠질수 없는 suspend 키워드가 조금은 낯선 Continuation에 대해 알아보겠습니다. 본 글은 [DroidKnights 2023] 김준비 - Coroutine Deep Dive - Android 실전편과 코틀린 코루틴의 정석 13장 코루틴 심화를 참고하여 작성하였습니다.1. Suspend 함수는 어떻게 동작할까 ? 코루틴이 suspend 함수를 통해 suspended 상태가 되면 Continuation 이란 것을 사용해 정지된 코루틴을 재개할 수 있습니다. 스레드는 Blocking 상태가 되면 사용중이던 자원을 점유하는데 반해 코루틴은 suspended 상태가 되면 어떤 자원도 사용하지 않으며 다른 코루틴이 자원을 사용할 수 있도록 오픈..
안드로이드 클린아키텍처 에러 핸들링 (부제: 상속을 지양하자) 서론다온길 프로젝트를 진행하며 네트워크 에러처리에 대한 부분을 구현하며 상속에 대한 문제점을 알게 되었습니다. 그 과정을 기록하며 상속의 문제점과 상속을 회피할 수 있는 몇 가지 대안을 알아보겠습니다. 이번 글은 이펙티브 코틀린 36장 "상속보다 컴포지션을 사용하라"를 기반하여 작성됩니다.1. 기존 코드를 살펴보자📌 Domain Layersealed class NetworkError : Throwable(){ abstract override val message: String}data object ConnectError : NetworkError() { override val message: String get() = "서버에 연결할 수 없습니다. \n인터넷 연결을 확인한 후 다시 시..