Android/기타 썸네일형 리스트형 [Android] 멀티스레드에 대한 개인적인 생각 Java를 공부하다보면 Thread라는 녀석을 볼 수 있다. 공부할 당시에는 '이게 왜 필요하지?'라는 생각이 처음에 들었었고 또 이걸 실제로 적용을 어떻게 시키는지에 대해서도 이해가 잘 안 되었던 것 같다. 그래서 첫 회사에서 멀티스레드로 구현을 하면서 많은 이슈(에러 및 버그)를 겪었었고 그 과정에서 정리할 수 있었던 포인트에 대해 정리해보려고 한다. 아마 신입들한테 도움이 되지 않을까 싶다.(스레드 고수들은 굳이 안 읽어도 됩니다...) 1. 멀티스레드는 왠만하면 피해라. 이제 막 신입 아니면 스레드에 익숙치 않은 개발자라면 특히 해당된다. 멀티스레드로 에러가 발생한다면 사수 없이 찾기란 거의 불가능에 가깝다고 생각한다. 경험이 좀 쌓이고 나서 해도 늦지 않다...... 2. 라이브러리를 잘 활용하.. [Android] 로그에 대한 개인적인 생각 개발자라면 업무 중에 무조건 볼 수 밖에 없는 것이 로그다. 개발을 하면서 로그를 좀 더 현명하게 사용할 수 있지 않을까라는 생각 때문에 이 글을 쓰게 되었다.(안드로이드 기준이지만 다른 분야에도 적용가능한 부분일 듯......) 로그에 대해 아무런 생각이 없었을 때 - 단순하게 디버깅을 위한 용도로 많이 사용 - 안드로이드의 Logcat에서 내가 찍은 Debug 로그와 죽을 때 받는 Error 로그들만 주로 확인. 아마 대부분 초보 개발자 분들이나 혹은 구현이 목표인 개발자 분들은 로그를 위와 같이 생각하고 대하지 않을까 싶다. 하지만 서비스를 운영하고 유지보수하게 되면 위와 같이 생각할 경우 매일 버그와 뒹굴다가 지치는데 많은 힘을 쏟게 되는 경우가 흔한 것 같다.(정말 잘 개발하시는 분이 아니고서야.. [Android] Android Geocoder maxResults 값에 대해서 안드로이드에서 위경도로 주소명을 받을 때 Geocoder 객체의 getFromLocation API를 사용한다. 그런데 getFromLocation에서 결과값 리스트가 비어서 오는 경우가 있었다. 파라미터는 위도, 경도, 그리고 문제의 maxResults 세 개였고 maxResults 이름만 보고 결과값을 최대 몇 개까지 받을 것인지에 대한 파라미터로 추측했었다. API 문서에서도 보면 딱히 자세한 설명도 없고 예제 샘플이나 다른 사람들이 한 것을 보더라도 maxResults 값을 1로 하고 있었기에 추측하고 있는 것이 맞는구나라고 생각했던 것 같다. 봤던 API 문서의 경로는 다음과 같다. developer.android.com/reference/android/location/Geocoder Geoco.. [Android] Retrofit2 응답 대응 처리 onResponse : 서버로부터 응답이 정상적으로 온 경우에 대해서 처리 200, 401, 403 등등의 정상적인 서버 응답 onFailure : 에러 때문에 네트워크 요청 실패 혹은 응답에 문제가 있는 경우에 대해서 처리 Exception 기준으로 분리할 수 있음 java.net.UnknownHostException(해당 호스트를 찾을 수 없는 경우 - 서버가 내려갔다던가... 등등) java.io.IOException(이 경우는 2가지 상황이 있었음) 네트워크 에러 파싱 에러 Retrofit2의 기존 컨버터 이용시 해당 형식으로 파싱이 안 되는 경우 발생 GsonConverter의 경우 모든 Response가 Json형식으로 와야하는데 아무런 데이터가 없는 경우에도 이 에러가 떴음(내부적으론 Jso.. [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.. 이전 1 2 3 4 5 다음