728x90

android

    [Android] Kotlin으로 안드로이드 개발 시 테스트 하는 법 - MockK

    프로젝트를 진행하며 테스트 코드의 중요성은 잘 알고 있었지만, 테스트 코드를 작성하는 게 익숙지 않기도 하고 일정이 빠듯하다는 핑계로 테스트 코드를 작성하지 않았었다. 언제까지 미룰 순 없어서 테스트 코드 작성법에 대하여 공부하게 되었고, MockK 라이브러리를 사용하여 테스트 코드를 작성하는 법을 알게 되었다. MockK 테스트 코드 작성 시 mock 처리를 위해 Java에서는 Mockito를 많이 사용한다. Kotlin에서는 Mockito와 유사한 MockK라는 라이브러리가 존재한다. Mockito와 사용법이 유사하여 조금만 노력하면 쉽게 적응할 수 있다. Dependency MockK를 사용하기 위해선 dependency 추가가 필요하다. 이 글을 쓰고 있는 현재의 최신 버전은 1.10.1이다. t..

    [Android] Sticky Header RecyclerView 응용하기

    이번 포스팅에는 위와 같은 애니메이션 효과를 구현할 것이다. 위의 구글 캘린더 앱을 보면 왼쪽의 날짜와 요일이 좌측 상단에 고정되어 표시되고 있다. 같은 요일의 일정들이 있으면 좌측의 날짜는 고정이 되고 다음 요일로 지나가게 되면 위로 밀려 올라가는 방식이다. 프로젝트에서 위와 같은 애니메이션을 적용해야 했을 때 Sticky Header RecyclerView가 떠올랐다. 보통의 Sticky Header RecyclerView는 위의 사진과 같이 RecyclerView에서 위의 헤더를 고정시킬 때 많이 사용한다. 위와 같은 방식을 조금 응용하면 쉽게 구현할 수 있을 듯 했다. Sticky Header RecyclerView는 RecyclerView에 ItemDecoration을 추가하는 방식으로 사용한다..

    [Android] LeakCanary로 메모리릭 잡기

    LeakCanary란? LeakCanary란 Square사에서 만든 오픈소스 라이브러리로써, 메모리릭을 감지하여 OOM(Out of Memory) 에러를 줄일 수 있도록 도와준다. 메모리릭(Memory leak)이란? 메모리릭이란 애플리케이션에서 더 이상 필요로 하지 않는 객체의 참조를 가지고 있는 것이다. 이렇게 되면 해당 객체에 할당된 메모리를 회수 할 수 없게 되고OOM을 발생시킨다. 안드로이드에서는 주로 객체의 라이프사이클과 관련해서 많이 발생한다. 예를 들어, Activity는 onDestroy() 함수 호출 이후엔 더 이상 필요 없어지게 되며 GC의 대상이 되어 메모리 할당을 해제한다. 하지만 어디선가 Activity를 강하게 참조하고 있다면, GC의 대상에서 제외되서 메모리릭이 발생하게 된..

    [Android] 문자열 단/복수 처리 - plurals

    다국어를 지원하는 앱이라면 문자열을 처리할 때 보통 strings.xml 에서 문자열을 가져와서 보여줍니다. strings.xml 파일로 대부분의 문자열을 처리할 수 있지만, 만약 영어처럼 단/복수가 구분된 경우에는 어떻게 처리를 해야 할까요? 이런 경우에는 안드로이드 리소스 중에 plurals 요소를 사용하면 편리하게 관리할 수 있습니다. plurals 요소를 활용할 수 있는 예로는 one minute, 2 minutes이 있습니다. 먼저 plurals 요소를 사용하지 않고 string 요소를 사용한다면 어떻게 표기해야 할까요? 우선 strings.xml에 리소스를 만들어 줍니다. %d분 %d분 one minute %d minutes 단수, 복수를 구분하여 2개의 리소스를 만든 뒤, 소스 코드에서 개수..

    [Android] Kotlin에서 LiveData의 null 허용 개선 - NonNullLiveData

    MVVM 패턴에서 LiveData는 반응형 프로그래밍으로써 매우 인기 있고 간단한 접근 방식입니다. Google I/O 2017에서 Kotlin을 공식 언어로 발표함과 동시에 AAC를 발표했지만 LiveData는 Java로 짜인 라이브러리입니다. 이 때문에 Kotlin에서 사용할 때는 몇 가지 문제점이 있습니다. 문제점 Kotlin에서는 null에 대한 체크가 엄격합니다. String과 String?의 차이는 Kotlin을 공부하신 분들이라면 다들 아실 거라고 생각합니다. 아래의 코드에서 이와 관련된 LiveData의 문제점이 있습니다. val sampleLiveData: LiveData = ... // nullable val currentValue = sampleLiveData.value sampleL..

    [Android] RecyclerView에 divider 넣기 - ItemDecoration

    RecyclerView를 사용하다 보면 아이템들을 구분하기 위해 divider를 넣는 경우가 많이 생긴다. 보통 이런 경우에 아래 코드처럼 아이템에 View를 추가하여 만들곤 한다. 하지만 이런 방식으로 divider를 추가해주면 몇 가지 문제가 발생한다. 1. 성능에 영향이 간다. - 레이아웃에 불필요한 뷰를 추가함으로써 레이아웃 계층이 증가하게 되고 그에 따라 성능에 좋지 못한 영향을 끼친다. 2. 좌우 스와이프 하는 애니메이션이 있다면 divider도 함께 움직인다. - 각각의 아이템에 View로 추가한 방식이기 때문에 아래 사진처럼 스와이프 동작이 있다면 구분선이 함께 움직이게 된다. 3. 각각의 divider를 컨트롤하기 힘들다. - View로 구분선을 추가한다면 각각의 구분선을 조절하기가 힘들..

    [Android] LiveData setValue() vs postValue()

    최근에 프로젝트에서 백그라운드 쓰레드에서 콜백 함수를 호출해 LiveData의 값을 변경해줘야 하는 로직이 있었다. 이때, setValue() 함수를 호출해 값을 변경해줬는데, 값이 변경되지 않는 이슈가 있었다. 찾아보니 setValue()를 사용한 게 문제였고, setValue()와 postValue()의 차이점에 대해 다시 한번 공부하게 되었고 이 글을 쓰게 되었다. LiveData는 Android Architecture Components(AAC)에서 제공하는 라이브러리 중 하나다. MVVM 패턴을 적용한다면 ViewModel, DataBinding과 함께 많이 사용하는 라이브러리다. LiveData는 Observer 패턴을 따르며 데이터의 변경이 일어날 때마다 콜백을 받아 원하는 동작을 실행할 수..

    [Android] ConstraintLayout 가상 오브젝트 - Guideline, Barrier, Group

    ConstraintLayout에는 레이아웃을 구성하기 위한 가상 오브젝트들이 존재한다. 가상 오브젝트란 실제 레이아웃에는 나타나지 않으며, 실제 레이아웃을 배치할 때 좀 더 편리하게 구성할 수 있게 도움을 준다. 1. Guideline 가이드라인은 가로 또는 세로의 축을 가진 가상의 뷰로써, 부모 뷰의 특정 위치를 기준점으로 삼을 때 사용한다. 가로/세로를 적용할 때는 LinearLayout과 같이 android:orientation 옵션으로 설정할 수 있다. 가로/세로를 정했다면 이제 위치를 정해야 한다. 위치를 정하는 옵션으로는 3가지가 있다. app:layout_constraintGuide_begin app:layout_constraintGuide_end app:layout_constraintGui..

728x90