안드로이드

Android

Codelab으로 LiveData 알아보기 - 4. Add a game-finished event(1)

현재 우리가 수정한 앱은 'End Game' 버튼을 누르면 점수 화면으로 넘어간다. 우리는 플레이어가 모든 단어를 거치고나면 점수 화면으로 이동하기를 원한다. 플레이어가 마지막 단어를 끝내면 게임이 자동으로 끝나서 버튼을 누를 필요가 없도록 만들고 싶다. 이 기능을 구현하기 위해 우리는 이벤트가 발생되어야 하고 ViewModel에서 모든 단어가 보여졌을 때 프래그먼트에 전달되어야 한다. 이를 위해서는 LiveData 옵저버 패턴을 적용해야 한다. Observer pattern은 observable(Subject)과 observer 사이의 통신을 정의한다. 이 앱의 LiveData의 경우, 위 그림의 Subject는 LiveData 객체이다. 그리고, Observer들은 프래그먼트와 같은 UI contro..

Android

종종 간과하는 문제 해결 에피소드(feat. Handler, Thread)

오늘은 회사에서 마주한 에러를 해결했던 에피소드를 적어보고자 한다. 사실, 되게 사소하지만 크리티컬한 문제였다. 가장 먼저 오늘 마주한 에러를 다시 재현하기 위해 내 노트북에서 샘플앱을 만들었다 ㅋㅋㅋㅋㅋ 마주한 에러 로그를 첨부하겠다. java.lang.RuntimeException: Can't create handler inside thread Thread[Timer-0,5,main] that has not called Looper.prepare() at android.os.Handler.(Handler.java:227) at android.os.Handler.(Handler.java:129) at android.app.Dialog.(Dialog.java:138) at android.app.Dialo..

Android

구글 플레이 개발자 이름 주의 사항(오늘도 여전한 구글)

바로 본론으로 가보자면, 작년에 올려두었던 데모 앱이 갑자기 정책 위반으로 삭제되었다는 메일이 왔다. 작년에 올리고 손도 안댔는데 무슨 정책위반이야? 하고 메일을 열어보니 더 황당한 문제가 있었다. 내 블로그 이름처럼 플레이 스토어의 개발자 이름은 bonustrack02였다. 하지만, 개발자 이름이 정책 위반이라는 것이었다. (이 무슨 미친 소리인가 싶었다. 1년이나 됐는데 이제와서?) 더 이상 사용하지 않을 앱일지라도 기분이 나빠 이의 제기를 했다. 내 닉네임이 어떤 정책을 위반했길래 앱이 삭제되었을까? 나 참... 어이가 없었다. 그럼 개발자 이름이 만약 'freedom02' 이런 식이면 이것도 정책 위반이냐고;; 뭐 아무튼 나는 슈퍼 을이니깐 곧바로 이름을 변경했다. 무슨 볼드모트냐고 내가 내 닉네..

Android

원하는 화면에서 앱이 백그라운드로 진입 시 종료시키기(feat. Application)

회사에서 진행하는 프로젝트 요구 사항 중 특정 화면에서 앱이 백그라운드로 진입하면 앱을 종료시키는 상황이 있었다. 고민이 많았다. 매우 단순히 Activity가 onStop될 때, 꺼버리자! 라는 생각을 했는데 당연하게도 아주 우매한 생각이었다. 왜냐하면, 예를 들어 메인 페이지에서 설정 화면으로 이동할 때 onStop이 호출되고 그냥 앱이 종료되었다. (이것도 생각못하냐고 하면 뭐... 할 말이 없다) 그럼 어떻게 할까 일단 앱이 백그라운드로 진입할 때 무조건 onDestroy까지 호출될 수는 없었다. 여러 고민을 거쳐 결국 라이프사이클을 사용해 구현해냈다. 1. 먼저, 모듈 수준의 build.gradle에서 라이브러리를 추가해주어야 한다. implementation 'androidx.lifecycle..

Android

Android Studio Waiting For Debugger 현상 해결

오늘은 안드로이드 스튜디오가 나를 아침부터 지겹게 만들었다. 바로, 디버거가 제대로 안 붙는 버그 때문이었다.(거지같은..) 저녁을 먹고 나서야 해결했었는데 그 전에는 그냥 일반모드로 실행하고 로그캣에서 크래시날 때마다 에러를 확인하며 코드를 수정했다. 그렇게 버티다 결국 디버그모드가 필요했는데 제대로 실행되지 않았다. 스튜디오 하단의 task들은 정상적으로 수행이 되었고 빌드까지 successful 이라면서 정작 디바이스 화면에는 이 화면만 보이고 있었다. 결국 짜증이 극도로 올라온 상태에서 동료들과 식사를 마치고 다시 회사로 돌아오며 부장님께 슬쩍 여쭤보았다. 부장님, 혹시 디버그 모드로 계속 재실행하다보면 안될 때 어떻게 하세요? 휴대폰 껐다 키고, 스튜디오 캐시 날려봐 아까 오전부터 스튜디오 캐시..

Android

안드로이드 스튜디오와 Gradle 버전의 호환성 이슈

최근 회사에서 디자인이 도착해 레이아웃 편집을 할 일이 많아져 작업을 하는데 이놈의 안드로이드 스튜디오에서 레이아웃 프리뷰가 안되는 버그가 계속 발생했다. 그래서 교수님께 여쭤보았더니 이유는 모르지만 현재 전기 뱀장어(Electric Eel) 버전이 xml 렌더링이 엄청 느려서 못 써먹겠더라.기린(Giraffe) 버전을 사용해봐 라고 답변을 해주셔서 기린 버전을 다운받으러 구글에 검색하니 일단 '안드로이드 스튜디오 다운로드'로 검색하면 뱀장어 버전만 다운로드 받을 수 있어 다시 '안드로이드 스튜디오 giraffe'로 검색해 다운로드하는 링크를 찾았다. 그런데, 이는 stable 버전이 아니고 Canary channel에서만 배포된다고 한다. 뭐 그게 베타 채널같은 느낌일까. 아무튼 따로 집에서도 똑같이 ..

Android

기존 프로젝트의 Java to Kotlin 전환 시 주의점

이번에 액티비티가 두 개 있는 정말 간단한 앱을 업데이트하면서 기존 Java로 작성된 파일을 Kotlin 변환 기능을 사용해 변경했다. 그리고 아무 생각없이 스토어에 업데이트를 올렸는데 내가 테스트해보니 이게 웬걸.. 그냥 실행조차 되지 않았다. 그래서 에러 로그를 보니 처음보는 에러가 있었다. 무슨 일일까 검색해보았다. 대부분 매니페스트에 액티비티가 등록되지 않은 경우가 많았는데 나는 이 경우일수는 없었다. 결국 여러 상황을 찾아보니 또 Gradle 문제였다. 프로젝트 수준의 build.gradle에서는 코틀린 플러그인이 제대로 추가되어있었는데, 모듈 수준의 build.gradle에서는 플러그인이 추가되어있지 않아서 .kt 확장자인 액티비티를 인식하지 못한 것이었다. 나처럼 무작정 Java to Kot..

Android

Codelab으로 LiveData 알아보기 - 3. Encapsulate the LiveData

캡슐화는 객체의 필드에 직접 접근을 막는 방법이다. 우리가 객체를 캡슐화할 때 private인 내부 필드를 수정할 수 있도록 public 메소드들을 제공해야 한다. 캡슐화를 사용하면 다른 클래스가 이 내부 필드를 어떻게 조작할지 제어할 수 있다. 현재, 우리가 수정한 코드에서 viewModel.score.value를 사용하듯 모든 외부 클래스에서 score와 word 변수를 수정할 수 있다. 우리가 지금 만드는 이 앱에서는 문제가 없을 수 있지만, 출시용 앱에서는 ViewModel 객체의 데이터를 조작해야한다. 오직 ViewModel이 앱의 데이터를 수정해야한다. 하지만, UI controller가 데이터를 읽을 필요가 있고, 그래서 데이터 필드는 완벽한 private이 될 수 없다. 앱의 데이터를 캡슐..

Android

Codelab으로 LiveData 알아보기 - 2. Attach observers to the LiveData objects

저번 단계에서는 score와 word의 데이터를 LiveData 객체로 바꿔줬다. 이번 단계에서는 Observer 객체를 작업한 LiveData 객체에 붙일 것이다. 우리는 fragment의 뷰(viewLifecycleOwner)를 LifecycleOwner로써 사용할 것이다. 왜 viewLifecycleOwner를 사용할까? 프래그먼트의 뷰는 프래그먼트 자체가 부서지지 않더라도 사용자가 다른 곳으로 이동하면 부서진다. 이것은 필연적으로 프래그먼트의 lifecycle과 프래그먼트 뷰의 lifecycle 두 lifecycle을 만든다. 프래그먼트의 뷰 대신 프래그먼트의 lifecycle을 참조하면 뷰를 업데이트할 때 사소한 버그가 생길 수 있다. 그래서, 프래그먼트의 뷰에 영향을 미치는 observer를 ..

Android

Codelab으로 LiveData 알아보기 - 1. Add LiveData to the GameViewModel

첫 번째로 ViewModel에 LiveData를 적용해 볼 것이다. LiveData는 생명 주기를 인지하는 관찰 가능한 데이터 홀더 클래스이다. 예를 들어, 우리는 이 앱에서 현재 점수를 LiveData로 감쌀 수 있다. 이번 코드랩에서는 LiveData의 여러 특성을 배울 것이다. - LiveData는 관찰 가능하다. 이 뜻은 LiveData 객체가 가지고 있는 데이터가 변경될 때 observer에게 감지된다는 의미이다. - LiveData는 데이터를 가지고 있다. LiveData는 wrapper이고 모든 데이터와 같이 사용될 수 있다. - LiveData는 생명 주기를 인식한다. LiveData에 observer를 붙일 때, observer는 LifecycleOwner와 연계되어 있다. (Lifecy..

BonusTrack02.dev
'안드로이드' 태그의 글 목록 (9 Page)