Android

    [Android] RecyclerView LayoutPosition vs AdapterPosition 차이를 알아보자!

    개발을 하던 중, RecyclerViewAdapter를 구현해야 하는 상황이 생겼습니다. 그러다 문득 ViewHolder 내부 메서드를 살펴보았는데, 이 중 position을 반환하는 함수가 정말 다양하다는 사실을 알게 되었습니다. 그럼 position을 반환하는 많은 메서드 중에서, 과연 무슨 함수를 사용해야 하는 것일까? 한 번 차근차근 살펴보도록 하겠습니다! /** * @deprecated This method is deprecated because its meaning is ambiguous due to the async * handling of adapter updates. You should use {@link #getLayoutPosition()} or * {@link #getAdapterP..

    [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] OutOfMemoryError: Java heap space 오류 해결 방법

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

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

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

    [Android] startActivityForResult() depreacted 해결 : ActivityResultContracts

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

    [Android][0] MVVM 패턴이란?

    * 본 내용은 스스로 학습한 내용을 정리한 게시글입니다. * 오늘부터 Android의 MVVM 패턴에 대하여 정리해보려고 한다. 이미 기존에 대략 공부를 해보긴 했지만, 지식이 너무 얇팍하고 부족함을 느껴 글로 정리해보려고 한다. MVVM 패턴을 사용해야 하는 이유 기존에 Android 앱을 개발하다보면 Activity 하나에 모든 기능을 쏟아붓고 방치해두다가, 며칠 지나서 수정할 일이 생겨 프로젝트를 열어보면 내가 작성한거지만 무슨 용도로 해놓은 메소드인지, 클래스인지 구분하기 어려울 정도로 체계적이지 않았다. 그러다보니 기능 추가 및 수정시 다시 소스코드를 분석해야 하므로 시간이 오래 소요되는 불필요한 상황이 만들어진다. 이런 코드를 흔히 스파게티 코드(spaghetti code)라고 부른다. (코드..