Android/스터디

    [Android] ConstraintLayout을 사용해야 하는 이유

    최근 github의 안드로이드 프로젝트의 xml을 확인해 보면, 거의 대부분의 프로젝트가 레이아웃을 ConstraintLayout을 채택하고 있습니다. 뿐만 아니라, 안드로이드 스튜디오에서 새로운 프로젝트를 생성하면 기본 레이아웃으로 ConstraintLayout을 제공하고 있습니다. 기존에 사용되던 LinearLayout, RelativeLayout 등 여러 Layout이 있음에도 불구하고 ConstraintLayout을 사용하는 이유는 무엇일까요? ConstraintLayout ConstraintLayout은 안드로이드에서 제공하는 레이아웃(Layout) 중 하나로, 뷰(View)를 배치할 때 제약 조건(Constraint)을 사용하여 제어하는 방식을 사용합니다. 기존의 LinearLayout, Re..

    [Android] Thread의 interrupt()와 stop()

    ■ Thread.stop() Deprecated 된 이유 Thread는 run() 메서드 내부의 코드가 모두 실행되면 자동적으로 종료됩니다. 하지만, 경우에 따라 개발자는 실행 중인 Thread를 즉시 종료할 필요가 발생할 수 있습니다. 예를 들어, 음악이 틀어져 있는 상태에서 음악의 진행도를 Progress로 표현하고자할 때 Thread를 사용한다면, 음악이 종료되었을 때, 더 이상 Progress를 변화시킬 필요가 없으므로 Thread를 종료시켜 메모리를 절약해야 합니다. 이전에는 이러한 경우에 Thread의 stop() 메서드를 호출하여 종료시켰지만, Oracle이 제공하는 Java API 문서에 따르면, This method is inherently unsafe. 를 시작으로 메서드가 사라졌음을 ..

    [Android] ViewTreeObserver를 이용하여 View가 그려지는 시점을 알아보자! (getWidth(), getHeight()의 출력값이 0인 경우..)

    ViewTreeObserver View의 높이를 구하기 위해, onCreate() 콜백 메서드에서 getHeight() 혹은 getMeasuredHeight()를 호출하면 0이 반환되곤 합니다. 그 이유는 높이를 얻고자 하는 View가 아직 화면에 그려지기 이전에 호출했기 때문입니다. ViewTreeObserver를 알기 전에는 자바에서는 Thread, 코틀린에서는 Coroutine을 사용하여 n MS(Millisecond) 만큼 시간이 지났을 때 높이를 얻으라고 했을 것입니다. 하지만 이런 방식은 View가 그려진 정확한 시점을 알지 못하기 때문에, n MS라는 시간 안에 View를 그리지 못하는 상황이나 기기 스펙에서는 똑같이 0을 반환하는 시간차 문제가 발생할 것입니다. 그렇기 때문에 알아야하는 것..

    쿠키(Cookie)와 세션(Session)을 이용한 로그인

    쿠키(Cookie)와 세션(Session) 동아리 프로젝트 기획 단계에서 '로그인 기능을 어떠한 방식으로 구현하는 것이 효율적일까?' 라는 생각을 하게 되어, OAuth, JWT 등 여러 방법들 중에서도 쿠키와 세션을 이용한 로그인 방식을 우선적으로 공부하여 정리합니다. 쿠키(Cookie)란? 쿠키(Cookie)란 서버가 사용자의 웹 브라우저(Client)에 저장하는 데이터입니다. 쿠키의 형태는 Key : Value의 String 형식으로 이루어져 있습니다. 쿠키당 최대 4Kb까지 저장할 수 있으며, 쿠키 표준안인 RFC2109에 따르면, 300개까지 만들 수 있습니다. 다만, 브라우저마다 저장되는 쿠키가 다르기 때문에, 예를 들어 크롬에 남긴 쿠키는 IE에서 사용할 수 없습니다. (브라우저가 다르면 서..

    [Android] 안드로이드 Strings.xml 국가별 언어 설정 방법 및 국가 코드 정리

    개발을 하다 보면, Android, ios 상관없이 다국어화를 해야 하는 경우가 발생하곤 합니다. 한국에서 중국어나 일본어로 된 앱을 잘 사용하지 않듯이, 본인의 모국어에 맞추어 화면에 텍스트를 보여줄 필요가 있습니다. 이번 시간에는 다양한 국가에서 앱을 사용하기 편하도록 설정하는 다국어 설정을 해보겠습니다. 우선 위 사진을 살펴보면, values와 values-ko 두 가지가 있습니다. values의 경우 우리가 처음 안드로이드 프로젝트를 실행하면 자동으로 생성되는 폴더로, 어떠한 나라에서든지 Default로 사용되는 폴더입니다. 그 아래를 보면 values-ko라는 폴더가 보이는데, 이는 한국어로 설정한 기기에서 앱을 실행했을 때 사용될 폴더입니다. 이처럼 특정 국가의 언어를 지정하고 싶으면, 국가 ..

    [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] 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()를 호출 한 후에 로그인을 완료를 알리는 메서드를 통해 다음 액티비티로 넘어가는 로직을 수행하고자 하였다.) ..