전체 글

전체 글

    [Android] MVVM ViewModel 오류 : Can't access ViewModels from detached fragment 해결방법!

    MVVM 패턴을 기반으로 프로젝트를 진행하던 중, 아래와 같은 오류가 발생하였습니다. JNI DETECTED ERROR IN APPLICATION: JNI FindClass called with pending exception java.lang.IllegalStateException: Can't access ViewModels from detached fragment Detached된 Fragment에서 ViewModel에 접근할 수 없다는 내용인데요... 무슨 뜻인지 해석했음에도 불구하고 몇 시간의 삽질을 해야만 했습니다..ㅎㅎ 곰곰이 생각해보니 Android Lifecycle을 조금만 생각해봤다면 금방 해결했을텐데 말이죠.. 😅 어떤 코드에서 오류가 발생하였는지 함께 살펴보겠습니다. 🎈 class M..

    [Android] 카카오맵을 2개 이상 ADD했을 때 발생하는 오류 대처 방법! DaumMap does not support that two or more

    안드로이드 개발 중, 저를 포함하여 카카오맵 API를 사용해보신 분들이라면 충분히 겪으셨을만한 오류입니다. 카카오측에서 카카오맵은 MapView 내부 구현 구조 및 OS 제약으로 인해, '한 화면에 동시에 2개 이상을 띄우는 것이 불가능' 하다고 합니다! 만일 2개 이상의 맵뷰를 생성한다면 아래와 같은 예외가 발생할 것입니다. DaumMap does not support that two or more net.daum.mf.map.api.MapView objects exists at the same time 말 그대로 'MapView는 동시에 2개 이상 존재할 수 없다'는 의미로 해석됩니다. 그럼 어떻게 위와같은 오류를 해결할 수 있을지 알아보겠습니다. 기본적인 개념은 이렇습니다. A 액티비티에서 B 액티..

    [Android][1] MVVM패턴 Databinding 맛보기!

    * 본 내용은 스스로 학습한 내용을 정리한 게시글입니다. * 데이터바인딩(DataBinding)이란? 기존에는 레이아웃의 뷰를 참조하기 위해서는 아래와 같이 findViewById() 메서드를 사용하였다. val button: Button = findViewById(R.id.my_button) 하지만 이러한 방식은 같은 한 화면에는 여러 개의 뷰가 존재하는 액티비티 클래스에 동일한 메서드를 너무나도 많이 호출시키게 만들어 클린 코드에 적합하지 못하다고 판단하였다. 그래서 등장하게 된 것이 바로 데이터바인딩(DataBinding)이다. 데이터바인딩을 사용했을 때의 장점 1. findViewById를 연속적으로 사용할 필요 없이 binding 객체 하나만 있으면 뷰를 참조할 수 있다. 2. RecyclerV..

    [Android][어따세워] 음성인식으로 주차장을 검색해보자! STT(Speech To Text) SpeechRecognizer

    이번 포스팅에서는 계속해서 '어따세워' 프로젝트의 구현 파트를 다뤄볼 것이다. 주차장을 리스트를 검색할 때, 주차장 명을 직접 타이핑하여 검색할 수도 있겠지만, 사용자의 편의를 위해 음성인식 검색까지 구현해보고자 하였다. (실행 결과는 코드 맨 아래에 있습니다.) . . . 우선 음성인식 기능을 구현하기 위해서 Manifest에 RECORD_AUDIO 권한을 추가해주어야 한다. binding.searchBarContainer.voiceButton.setOnClickListener { PermissionHelper.checkRecordPermission(this@SearchActivity) { // 권한 승인된 상태라면 openVoiceDialog() // 음성인식 다이얼로그 오픈 } } @Suppress..

    [Android][어따세워] 앱 아이콘 제작 / 해상도별 사이즈 조절(포토샵)

    이번 포스팅에서는 안드로이드 '앱 아이콘 적용'에 대해 알아볼 것이다. 앱 아이콘을 적용한다고 하면, 단순히 이미지 하나만 준비하면 된다고 생각할 수 있지만 안드로이드에서는 그렇지만도 않다. 해상도 이미지 크기 (px) Google Playstore 512 x 512 px mdpi (160dpi) 48 x 48 px hdpi (240dpi) 72 x 72 px xhdpi (320dpi) 96 x 96 px xxhdpi (480dpi) 144 x 144 px xxxhdpi (640dpi) 192 x 192 px 그 이유는 안드로이드는 단말기의 화면 너비에 따라 해상도가 다르기 때문이다. 위 표는 안드로이드에서 사용하는 해상도 단위이자, 그에 따른 아이콘 이미지 크기를 정리한 표이다. 여기서 dpi(Dot ..

    [Android] OutOfMemoryError: Java heap space 오류 해결 방법

    OutOfMemoryError: Java heap space 오류 해결 방법 개발을 하다가 빌드를 하려고 하니 갑자기 위와 같은 오류가 출력되었다. 에러 이름은 'OutOfMemoryError: Java heap space'이다. 원인은 Heap 영역의 공간이 부족하여 발생한 것으로, 보통 Res / Raw 폴더에 큰 용량의 파일들이 저장되어 있기에 발생한다. 만약 대용량 파일들이 있다면, 데이터를 저장해두지 않고 실시간으로 받아오는 방법도 있으나, 간단하게는 단순히 설정만 변경해주면 된다. 우선 Gradle Scripts -> gradle.properties를 열어준다. 그럼 이렇게 -Xmx2048m 이라는 용량이 보이는데, 이 수치를 높여주면 된다. 나는 2배 높여서 -Xmx2048 -> -Xmx40..

    [Android][어따세워] [1] Android MVVM 회원가입&로그인 - 파이어베이스를 사용하여 계정을 등록해보자!

    이번 시간에는 계속해서 '어따세워' 앱의 회원가입 및 로그인 기능을 구현해보자! 로그인 부분은 크게 2가지로, '파이어베이스를 통한 구글, 페이스북 로그인', '카카오 SDK를 사용한 카카오 간편 로그인 기능' 을 구현할 수 있다. (이 외에도 더 다양한 로그인 방법이 존재하지만, 프로젝트에서는 크게 2가지로 국한시킵니다.) 이 포스팅에서는 구글 로그인만 포스팅을 할 것이며, 다른 로그인 기능들은 추후 이어서 포스팅할 계획이다. 우선, 미리 디자인 해놓은 레이아웃 화면이다. 포토샵을 사용하여 버튼을 적절히 디자인하였고, 배경 GIF는 상업용 사이트에서 다운받았다. 제목과 부제목란은 임의로 디자인하였다. (추후 변경 예정) 디자인은 나름 만족한다. (❁´◡`❁) 이제 파이어베이스를 들어가서 회원가입에 필요..

    [Android][어따세워] Retrofit2를사용하여 주차장 공공 데이터를 가져오자!

    '어따세워' 앱의 핵심 기능인 주차장 정보를 보여주기 위해서는 많은 양의 주차장 데이터가 필요하다. 그렇다면 이런 데이터들은 어떻게 얻을 수 있을까..? 바로 '공공데이터 포털'에서 제공받을 수 있다. https://www.data.go.kr/index.do 공공데이터 포털 국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase www.data.go.kr 공공 데이터 포털에는 주차장 데이터뿐만 아니라 다양한 데이터를 제공해주고 있으므로, 여러 데이터를 잘 활용하면 훌륭한 아이디어와 앱을 만들어낼 수 있다. 그럼 이제 본격적으로, 안드로이드에서 이러한 데이터들을 가져오..

    [Android] 코루틴 suspendCancellableCoroutine 비동기 처리

    프로젝트를 진행하던 중, 문제가 맞닥들였다. 문제는 회원가입 / 로그인 기능을 구현에 있었는데 함께 살펴보도록 하자. 위 코드는 Retrofit2 라이브러리를 이용해 회원정보를 서버로 넘기는 메소드이다. User DTO를 성공적으로 넘겼다면 onResponse 함수가 실행될 것이다. 이 부분만 보면 큰 문제를 느끼지 못 할 것이다. 하지만, 만약 register()를 완료한 후에 실행되어야 할 함수가 먼저 실행되면 어떤 문제가 발생하게 될까? register() 메서드 안의 코드는 콜백 형식이기 때문에 위 코드처럼 사용하게 된다면 정상적인 로직을 수행할 수 없다. (본인의 경우 register()를 호출 한 후에 로그인을 완료를 알리는 메서드를 통해 다음 액티비티로 넘어가는 로직을 수행하고자 하였다.) ..

    [Android] startActivityForResult() depreacted 해결 : ActivityResultContracts

    토이 프로젝트를 진행하던 중 startActivityForResult를 사용할 일이 생겨 onActivityResult와 함께 오버라이드를 한 결과... 위 사진과 같이 deprecated 되어 더 이상 지원하지 않는다는 것을 알게 되었다. 조금 더 자세히 알아보니 2020년 5월 기준으로 deprecated 되었다고 한다. 사라진 이유는 프로젝트 규모가 커질수록 onActivityResult 메소드 안에 들어가는 코드의 양이 늘어나기 때문이다. 예를 들어, onActivityResult 메소드에서 requestCode에 따라 분기를 나누어 로직을 수행하는데, 그 안에서도 조건에 따라 분기가 나뉘면 클린 코드에서 점점 멀어지게 될 것이다. 이러한 문제를 해결하기 위해서 ActivityResultContr..