Dev (86) 썸네일형 리스트형 [TIL] 24.06.04 Firebase의 Realtime Database와 Cloud Firestore 최종 프로젝트를 한창 진행 중에 있는데, Firebase를 이용한 원격 DB를 도입하게 되면서 고민해야 하는 부분이 생겼다.처음에 당연히 DB의 변화를 실시간으로 감지해서 UI에 변화를 발생시켜야 하는 부분이 많을 줄 알고(일종의 flow를 내려주는 격), Realtime Database를 채택했는데 앱의 윤곽이 잡히고 나니 생각보다 그런 부분이 적은듯 했다. 그래서 어떤 것을 도입할 지 공식문서를 읽어보면서, 확실하게 결정해서 리팩터링을 진행하기로 했다.Choose a database: Cloud Firestore or Realtime Database | Firebase (google.com) 데이터베이스 선택: Cloud Firestore 또는 실시간 데이터베이스 | Firebase5월 14일.. [Android] SharedFlow 사용 시, 늦게 생성된 View에서의 초기 값 문제 📝 문제 발생 LiveData를 StateFlow와 SharedFlow로 리팩터링 하던 도중, 사소한 문제가 생겼다. 특정 SharedViewModel의 LiveData를 Observe 해서 UI에 반영하는 코드가 있었는데, 리팩터링 이후 초기 값을 제대로 불러오지 못하는 문제였다. 해당 Fragment 탭을 눌러서 그 Fragment가 생성된 이후에, SharedFlow로 방출되는 event들은 제대로 반영이 되고 있으나, 초기값은 의도한 대로(가장 마지막 event를 이용해 초기화) 동작하지 않았다. 그래서 해당 SharedFlow를 collect하는 블럭에 Log를 찍어서 확인해 봤는데, View의 초기화 시점에는 해당 블럭이 트리거되지 않고 있었다. 📌 다양한 비동기 스트림과 문제 원.. [Android] Kotlin DSL 이용 시, API Key 은닉하기(AGP 9.0 미만) 흔히 토이 프로젝트 등을 할 때 api 키와 같은 정보를 local.properties에 은닉하곤 하는데 groovy를 사용할 때와 소소한 차이가 있어서, 오랜만에 작성하면 낯설게 느껴진다. 이번 기회에 글로 남기면서 정리하려고 한다. 1. local.properties에 키 값 작성하기 local.properties에 키 값을 이름=문자열 꼴로 작성한다. 당연히 이 파일은 형상 관리 시스템에서 제외되어야 한다. 2. 앱 수준 build.gradle에서 Properties 객체 생성 후, local.properties 파일 불러오기 사실 파일이 존재하는지 한번 확인하면 더 견고한 프로그램이 될 것 같다. 3. buildConfig에 등록하기 defaultConfig에서 지정하긴 했지만, 당연히 build.. [안드로이드 짤막공부] 23.09.30 카카오 API를 이용한 미디어 검색 앱을 만들던 도중, 오랜만에 오류를 겪었다. 대강 이런 오류였는데 아무래도 API를 통해 받아온 데이터를 바인딩하는 과정에서 오류가 나는 거 같았다. 유독 VideoItem의 playTime을 받아올 때만 오류가 발생했다. 처음에는 API의 response 값을 받아올 때 VideoItem에 대해 잘못된 값을 참조해서 존재해야 할 값이 없는가 해서 Postman으로 직접 API를 호출해 보니, response로 주어지는 인자들의 이름은 모두 제대로 SerializedName으로 처리해 둔 상태였다. 실제로 Retrofit 객체를 통해 전달받은 데이터들을 Log로 찍어 확인해 본 결과 모두 정상적으로 받아 오고 있었다. 그래서 문제가 발생한 ItemVideoBinding.. [안드로이드 짤막공부] 23.09.02 1. 오랜만에 버그가 생겨서 한참 고생했다. 평소처럼 액티비티 클래스와 레이아웃 생성 후, 해당 액티비티를 생성하는 Intent 인스턴스를 만들어 startActivity()를 이용해 실행하려 했다. 그런데 디자인 해둔 레이아웃이 존재함에도 불구하고 계속 흰 화면만 나왔다. 로그를 찍어 확인해보니 startActivity() 위 아래의 코드 모두 정상적으로 진행되고 있었고, 레이아웃 문제인가 싶어 확인해보아도 딱히 특별할 것 없는 ConstraintLayout이었다. 차라리 앱이 저 순간에 죽거나 에러라도 띄운다면 문제를 쉽게 해결하겠는데 전혀 문제가 발생하지 않아서 원인 찾기가 더 힘들었다. 문제가 있는 액티비티의 onCreate() 내에 로그를 찍게 하고 확인하니 해당 로그가 전혀 찍히지 않았다. 아.. [안드로이드 짤막공부] 23.08.22 1. 안드로이드 13을 탑재한 가상 머신의 오디오가 정상적으로 출력이 되지 않는 문제가 있었다. 더 낮은 레벨의 안드로이드 머신들에서는 정상적으로 출력되는데, 처음에는 디바이스 세팅 문제인가 싶어 꽤 헤맸다. 도저히 내 문제가 아닌 거 같아서 찾아보니 꽤나 오래 묵은 문제인 거 같았다. 그래서 포기하고 더 낮은 API레벨의 안드로이드로 테스트하려던 찰나에 마침 오늘자 당장 몇 시간 전 코멘트로 저런 게 있길래, 안드로이드 스튜디오 내에서 sdk를 업데이트해 주고 새 기기를 만들어 실행하니 오디오가 정상적으로 출력됐다. 코멘트가 올라온 타이밍이 예술이었다. 2. Foreground Service와 Notification을 이용한 음악 플레이어를 구현하고 있었는데, 만든 Notification에 대해 set.. [안드로이드 짤막공부] 23.08.21 1. 요즘 강의를 새로 듣고 있어서 혼자 고민할 부분이 적다보니 딱히 블로그에 쓸만한 오류가 발생하지 않았다. 그러던 차에 오랜만에 오류가 생겼다. ActivityCompat.requestPermissions( this, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), REQUEST_READ_EXTERNAL_STORAGE ) 외부 저장소 읽기 권한 요청을 발생시키는 위 코드가 기대한대로 동작하지 않았다. 리스너를 달아둔 버튼을 아무리 클릭해도 묵묵부답. 로그를 찍어 확인해봤지만 분명히 클릭 리스너와 메소드 진입은 정상적으로 일어나고 있었다. 혹시나 권한 요구 창을 이미 무시했나싶어 앱 재설치도 여러번 해봤는데도 결과는 같았다. 공식문서를 뒤져보니.. [안드로이드 짤막공부] 23.08.01 1. 요새는 이론 위주로 보고 있어서 딱히 오류가 생기거나 하는 게 잘 없었는데 오랜만에 에러와 맞닥뜨렸다. 'compileDebugJavaWithJavac' task (current target is 1.8) and 'kaptGenerateStubsDebugKotlin' task (current target is 17) jvm target compatibility should be set to the same Java version. ... 이런 에러였는데, 아무래도 내 컴파일 환경이랑 kapt 메소드가 동작할 수 있는 환경 조건이 맞지 않는 거 같았다. 해결 방법은 간단했다. build.gradle(Module) 내의 저 옵션들을 모두 버전 17로 맞춰주니 바로 해결되었는데 하나 이상한 건 발생한 에.. 이전 1 ··· 7 8 9 10 11 다음