본문 바로가기

Android

(43)
Haversine 공식으로 두 지점간의 거리를 구하기 이번에 신규 기능을 추가하기로 했다. 대충 배달어플에서 라이더가 목적지에 근접하게되면 판매자나 소비자에게 곧 도착한다는 알림을 전송하는 기능을 만들어 보자는 내용 앱 네비에서 어차피 경로를 표시해 주니깐 거기서 몇 미터 남았을때 호출할까.. 아니면 일정 범위를 설정한 뒤, 해당 범위 내에 접근하면 무조건 호출할까 고민 좀 했다. 어느 길로 가든 일단 인접하면 연락이 가게하는게 맞다고 생각되어 후자로 선택 그럼 해당 범위에 들어갔는지 계산하는 함수가 필요한데.. 여기서는 헤버사인(Haversine) 공식을 사용하는게 좋다. 지구상의 두 지점간의 거리를 계산할때 사용되는 공식이며, 일반적으로 위도(latitude)와 경도(longitude)를 사용해서 두 지점간의 최단 거리(대원의 호)를 계산한다. 수식은 ..
Retrofit2: 기본 사용 최신화: 2023.11.29~30 ‣ Intro Retrofit은 RESTful API를 사용 중인 안드로이드 개발자에게 매우 도움이 되는 라이브러리다. 이번 글에서는 Retrofit의 개념에 대해 공부해보자. ‣ Retrofit2? Retrofit2는 Android 및 Java 어플리케이션에서 사용되는 Type-Safety HTTP 클라이언트 라이브러리다. Square에서 개발되었으며, RESTful API 통신을 단순화하여 앱의 성능을 개선하는데 중점을 두고 있다. 정말 필요해서 Ktor같은 다른 웹 서비스 라이브러리를 사용하는 경우를 제외하면, 안드로이드의 통신분야에서 가장 많이 사용되는 라이브러리다. 그럼 왜 이렇게 Retrofit이 안드로이드 개발자들에게 각광을 받을까?? 다음과 같은 Retro..
코루틴 작업 분리 이전의 DB 작업의 연장선이다. 나는 api 통신 후, 해당 결과값을 바탕으로 UI를 갱신하는 것과 DB 갱신을 병렬적으로 진행시키고 싶었다. 그게 더 작업 속도를 빠르게 할 수 있을거라고 생각하기 때문이다. 뭐.. 대충 이런 흐름을 원했다. 그림이 좀 이상하긴 한데ㅋㅋ DB갱신은 별도로 분리하지 않고, ApiCall() 코드의 호출 성공 부분에 함께 작성해 뒀다. (가독성이 좋아서) 아무튼, 성공시 DB를 갱신하는 것과, 서버로 부터 수신한 데이터를 반환하는 코드가 병렬로 수행되도록 하는 것이 목표라는 것이다. val data = withContext(Dispatcher.IO){ApiCall()} ApiCall()이 withContext(Dispatcher.IO), I/O 스레드에서 진행이 되기 때문에..
Data Class의 equals와 hashCode를 사용해 DB 갱신하기 Resume때마다 서버로 부터 새로 데이터를 받아와서 DB에 저장하는데, 이때 DB의 데이터를 전부 삭제(;;)하고 새로운 데이터로 DB를 다시 작성하는 방식이었다. 비둘기가 거꾸로 날아도 날긴 나는거라고, 이런 코드가 2년간 유지되어 왔다는 사실도 놀랍지만 resume때 마다 10초 이상 정지된 화면을 바라보며 대기를 하는데 아무런 불만없이 사용해 주던 사용자분들에게도 미안했다. 그러던 중, 얼마전 훑어보았던 드로이드 나이츠 2020 발표 내용에 있던 "Data Class의 equals/hashCode" 내용을 응용해서 문제를 해결할 수 있지 않을까라는 생각들었다. https://speakerdeck.com/taehwandev/amado-effective-han-kotlin?slide=52 아마도 Ef..
ForegroundService 문제 해결하기: ForegroundServiceDidNotStartInTimeException 월요일 좋아근데 출근하고 늘 체크하는 Firebase Crashlystics에서 늘 고질적으로 발생하는 오류의 빈도가 향상된 것을 발견했다.월요일 안좋아 개인적으로 수정해서 빨리 눈앞에서 치워버리고 싶었는데, 지금까진 다른 일이 바빠서 해결을 어영부영 미루던 이슈였다.마침 진행 중이던 바쁜 일도 끝났고, 오늘도 어김없이 문제 목록의 상단에서 날 반겨주었기에 그냥 처리해버리기로 마음 먹었다. 내용 추가: 24.01.24android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException 이 오류는 서비스가 시작될 때 startForegroundService() 메소드를 호출한 후 일정 시간 내에 startForeground() 메소드를..
[Android Basic] Activities & Activity Lifecycle [들어가며..]Jetpack Compose의 등장으로 Android의 개발 방식이 근본적으로 바뀌어 가는 중이다.전통적인 XML 기반 레이아웃과 View 시스템에서 벗어나, 선언형 UI 프레임워크를 제공하여 UI코드를 더 간결하고 직관적으로 만들었다. 이 덕분에 UI 로직과 비즈니스 로직을 분리하기 쉬워졌고, 무엇보다 현재 PlayConsole이 APK에서 AAB 업로드 환경으로 변함에 따라 권장되는 멀티 모듈을 도입하는 것도 수월해 졌다. 그래서 필자는 Compose환경을 기반으로한 Android Basic 내용을 틈틈히 정리해 나가볼까 한다. 오늘 다룰 주제는 역시 Basic하면 빼놓을 수 없는 4대 컴포넌트, 그 중 가장 많이 접하게 되는 Activity와 그의 Lifecycle이다.Activity..
[Android Tip] Immortal Service (죽지 않는 서비스) [Immortal Service: 죽지않는 서비스]에어맨이 안죽음ㅋㅋ앱을 개발하다보면 죽지 않는 서비스(Immortal Service)가 필요한 순간들이 있다.필자는 사용자의 위치정보를 지속적으로 가져오는 GPS 서비스가 필요했다.당장 생각나는 다른 예시로는, 실시간 영상 스트리밍 어플을 구현할 때, Socket 통신 부분을 서비스 컴포넌트로 작성하여 스트리밍을 계속 유지할 수도 있겠다.이번 글에서는 앱의 필수 기능으로, 절대로 죽으면 안되는 서비스를 구현하는 방법에 대해서 알아보자. [주의]이후로 작성된 내용은 필자가 직접 구현하고 작성한 것으로, 검증을 받은 것이 아니다. 때문에 환경에 따라 문제가 발생할 수 있다는 것을 미리 고지한다.[다양한 구현 방법]죽지않는 서비스는 생각보다 다양한 방법으로 구..
[Android: Basic] 포그라운드 서비스 ( Foreground Service ) 개념 들어가며.. 면접 질문으로 4대 컴포넌트에 대한 질문을 종종 받았던 기억이 있다. 업무를 하며 기교만 늘어서인가, 이런 원론적인 질문에 제대로 답하지 못하는 자신의 헛점을 메꾸고자 내가 아는 선에서 개념을 정리하고자 한다. 빈약하고 허술할 순있지만, 최대한 아는 내용을 담으려고 노력하겠다. 최신 수정일: 2024.01.17 Service Component 안드로이드의 4대 컴포넌트 중 하나로, 안드로이드 개발자라면 Activity 다음으로 많이 접하게 되는 컴포넌트라고 생각된다. Service는 사용자 인터페이스(UI) 없이 앱의 백그라운드에서 긴 시간이 걸리는 작업을 수행하는 컴포넌트이다. 서비스는 보통 두가지로 구분된다. Foreground Service Background Service Backgr..