본문 바로가기

Android

[Android] Retrofit2 Converter를 커스텀 해보기 Android Retrofit2를 사용하면서 GsonConverterFactory를 업무에도 이용하고 사이드 프로젝트에도 이용하고 있다. 하지만 업무 중에 문제가 발생하였는데 200번대(성공일 때)에서 status code로만(ResponseBody가 비어있을 때) 로직을 처리할 경우에 문제가 되었다. 에러의 원인은 ResponseBody의 파싱 에러였는데 GsonConverterFactory에서는 응답 성공일 때 무조건 ResponseBody를 Gson으로 파싱하게끔 되어 있어서 그런 것이 원인이었다. 그래서 직접 만들기로 한 Converter에서는 파싱 에러일 때 body의 Length가 0인 경우 null을 return하도록 수정하였다. import androidx.annotation.Nullabl..
[Android] New Google Play Console 리뷰 7/3에 기존 플레이스토어 콘솔에서 앱 쪽으로 아예 접근이 안 되는 현상이 발생했다. 울며 겨자먹기로 Beta 버전 플레이 콘솔로 이용하게 되었는데 이용하면서 체감이 되는 바뀐 부분들을 정리하고자 한다. 1. 메뉴 정리(상세적인 기능은 같음) - 구글에서 생각했을 때 연관이 되어있을 것 같은 범주로 묶어 놓은 느낌이 든다. 2. 예약게시가 관리형 게시로 이름이 변경되었고 [게시 개요]에서 해당 설정을 수정할 수 있음(앱 정보에 없음) - 개인적으로 잘 바뀌었다고 생각하는 부분인데 기존에는 예약게시를 걸어놓고 게시를 했을 때 예약게시가 풀려서 불편한 부분이 있었다. 바뀌고 나서는 게시를 해도 풀리지 않기 때문에 이 부분이 좋은 것 같다. - 기능에는 변동사항이 없다. 3. 재무 보고서 등 원래 전체 메뉴에..
[Android] Doze 모드로 강제로 만들기 1, 2로 Doze모드를 만들고 3으로 Doze모드를 해제하면 된다. 1. adb shell dumpsys battery unplug 2. adb shell dumpsys deviceidle step - [Stepped to deep : IDLE] 왼쪽의 메시지가 뜰 때까지 2번 반복 3. adb shell dumpsys battery reset
[Android] View가 NullPointerException을 내는 경우 View가 NullPointerException을 내거나 혹은 다이얼로그를 보여주려고 할 때 발생하는 android.view.WindowManager$BadTokenException 등이 이 글에 해당한다. 초보자들의 경우 많이 접하는 에러 중에 하나가 아닐까 싶다. 심지어 Firebase Crashlytics에서는 android.view.WindowManager$BadTokenException인 경우 수정하는 방법까지 알려주니 말이다. 분명 코드상으로는 에러가 날 수 없는 상황임에도 불구하고 에러가 나오니 개발자 입장에서는 답답할 수 밖에 없다. Thread 문제와도 전혀 상관이 없다. 그럼 왜 View가 null이 되는 경우가 생기는 것일까? 이는 안드로이드의 기본인 Activity, Fragment..
[Android] Retrofit2 재시도 로직 넣기 안드로이드에서 API 콜 한 번 후 실패했을 때 자동으로 재시도하는 로직을 구현해야 할 때가 있다. 다음은 Retrofit2에서 재시도 로직을 넣는 커스텀 콜백을 구현하는 소스이다. import retrofit2.Call; import retrofit2.Callback; public abstract class AutoRetryCallback implements Callback { private final int mRetryLimitCount; private int mRetryCount = 0; public AutoRetryCallback() { this.mRetryLimitCount = 3; } public AutoRetryCallback(int retryLimitCount) { this.mRetryLi..
[Android] Android Studio에 Jira 이슈 연동 및 상태 바꾸기 회사에서 현재 Jira를 쓰고 있는데 작업이 끝나고 Jira에 가서 이슈의 상태를 바꾸고 하는 것이 귀찮아서 다른 방법이 있을까 했는데 역시 있었다.(역시 나만 귀찮은 게 아니었음 ㅎㅎ) 정리의 기준은 글을 쓴 시점의 Android Studio를 기준으로 한다.(v3.6.3) [기본 세팅] 1. 먼저 Atlassian 계정의 API 토큰을 생성해야 한다. 이 링크(https://id.atlassian.com/manage-profile/security/api-tokens)를 클릭 후 들어가면 API 토큰을 만들고 해당 토큰을 따로 기억해둔다.(잃어버리면 다시 만들어야 됨...) 2. Android Studio의 [Preference] -> [Tools] -> [Tasks] -> [Servers]로 들어감 ..
[Android] 인앱 결제 구현 Flow 정리 Android Billing SDK 라이브러리(2.2.0) 기준 내용입니다. 회사에서 기존에 쓰고 있던 AIDL 라이브러리를 교체할 겸 그리고 잘못 구현된 결제 로직을 다시 바로 잡기 위해 작업한 내용을 정리하고자 한다. 1. BillingClient 생성 및 연결 시도 - Application Context가 필요하기 때문에 Application 단에서 한 번 생성해 줌 - Client가 생성되면 Connect를 시킴 2. 상품 목록 조회 - 결제를 하려면 SkuDetails 객체가 필요하기 때문에 상품 목록 조회 과정은 꼭 필요함(앱 서버와는 관계없이 무조건) - 이 과정에서 결제할 상품에 대한 정보를 얻음 3. 상품 결제 요청 - 2번 과정에서 얻은 SkuDetail 객체로 결제 요청을 함 4. 결..
[Android] Retrofit2 중복 콜 문제 기존의 Volley를 Retrofit2로 교체하고 나서 간혹 API들이 두 번 혹은 세 번까지도 중복 콜이 발생한 경우가 서버 쪽에서 확인되었다. 원인은 바로 OkHttpClient의 retryOnConnectionFailure에 있었다. 이 옵션은 기본값이 true로 되어있는데 이 옵션이 활성화되어 있다면 OkHttpClient가 네트워크 상황이 불안정할 때 Retry를 시도하게 된다. 근데 문제는 Retrofit2에서 API 호출을 한 번만 했음에도 불구하고 그 안에 세팅해준 OkHttpClient 때문에 클라이언트 개발자도 모르게 자동으로 여러 번 API를 동시에 생성할 수 있다는 것이었다.(본인도 서버 개발자가 알려줘서 알게 됨) OkHttpClient의 버그는 아니고 OkHttpClient의 기..