본문 바로가기

[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의 기..
[Android] Firebase Crashlytics 연동하기 기존에 에러 로깅 툴은 Firebase에서 Fabric에서 쓰던 라이브러리로 써봤는데 이번엔 새로운 Firebase Crashlytics를 적용해보기로 했다. fabric에서 쓰던 라이브러리보다 많이 바뀔 수도 있다고 경고를 하긴 하는데 일단 Firebase에서 본격적으로 시작한 거니까 한 번 써 보는 것도 좋을 것 같다는 생각이 들어 적용하게 되었다. (library 이름이 com.crashlytics.sdk.android:crashlytics에서 com.google.firebase:firebase-crashlytics로 변경됨...) 연동방법은 이 링크를 참고하면 된다.(https://firebase.google.com/docs/crashlytics/get-started-new-sdk?hl=en&pl..
[Android] 인앱 결제가 안 될 때 체크해야 할 사항 기존 사내에 있던 프로젝트를 개발 버전과 운영 버전으로 따로 분리시키면서 개발 쪽 플레이스토어 프로젝트를 하나 추가하는 작업을 하게 되었다. 그 과정에서 있었던 이슈 및 처리방안에 대해 간단히 정리하고자 한다. 1. 당시 상황 - 개발 프로젝트는 알파 트랙에만 등록 - 개발용 앱은 DeployGate로 배포 1. 개발 프로젝트에서 결제가 안 되는 이슈 - 테스트 계정(구글 플레이)이 알파 내부 테스트에 등록되어 있는지 확인 - 테스트 계정으로 해당 알파 프로그램에 참여했는지 확인 - 테스트 계정이 결제 테스트용으로 등록되어 있는지 확인 2. 운영 프로젝트에서 결제가 안 되는 이슈 - 실제 결제는 실제 배포 버전보다 낮거나 같은 버전에서만 동작하므로 실제 결제 테스트는 무조건 테스트 계정으로 해서 확인해야..
[Android] Retrofit2 Gson 사용 시 주의사항 회사 신규 프로젝트에 Retrofit2를 사용하고 있던 중에 200 성공 응답을 받고 실패 로직을 타는 경우가 있었다. 분명 콜은 한 번만 들어갔고 다른 이슈 사항이 없었음에도 다시 Retry를 하는 증상이었는데 원인을 분석해보니 EOF Exception과 함께 실패로 처리가 되었던 것이 문제였다. Gson컨버터를 쓰려면 서버 쪽에서 body에 "{}"을 넣어줘서 처리를 하면 해결이 된다. 끝.