Programming/Android 21

RxJava 적용기

RxJava는 러닝커브가 다소 있는 것으로 알려져 있다. coroutine+suspend fun 와 비교해서 높은 수준의 작업을 실시간으로 처리할 수 있고, coroutine Flow 와 비교해서 더 안정적인 프로그래밍을 할 수 있다는 장점으로 인해 배울 가치는 충분한 것 같다. 배워야할 개념도 많고 빠른 기간 내에 전부 이해할 것은 기대하지 않지만 LiveData에서의 observe, Flow에서의 일부 오퍼레이터 경험(맛보기) 이 있으니 어느정도는 유리하게 시작할 수 있지 않을까?ㅎㅎ 차근차근 시작해보자 중요한 개념 Observable / Observer RxJava에서는 Observable을 구독하는 Observer가 존재하고, Observable이 순차적으로 발행하는 데이터에 대해서 반응한다. o..

Programming/Android 2021.10.03

2021 Droid Knights 컨퍼런스 후기

2021 9월 25일 드로이드 나이츠 온라인 컨퍼런스에 참가했다. 작년에 참가했을 땐 무슨말인지 너무 어려워서 뛰쳐나갔는데, 이번엔 끝까지 들었다 ㅎㅎ;; 작년과 달라진 점은 참가료(만원)이 있다는 것과 개더타운으로도 접속할 수 있다는 것이 있다. 컨퍼런스 일정은 아래와 같다. Track1과 Track2가 동시에 실시간으로 유튜브 스트리밍 방송되며, 취향에 따라 선택해서 들을 수 있다. 각 강의가 끝나면 짧으면 5분? 길면20분? 정도의 쉬는 시간이 있는데 이때 개더타운으로 QnA를 받기도 했다. 개더타운 내에는 토스, 헤이딜러, 카카오페이에서 채용 관련 홍보, 문의도 하고 있었다.(경력자들 대상인 것 같다) 이제 본론으로 들어가서 내가 들은것 요약+느낀점을 적어보겠다. 우선 나는 Track 2개를 동시..

Programming/Android 2021.09.25

Android Studio에서 Profiler 적용기

BC 앱을 리팩토링하면서 몇몇 성능 개선을 해왔다고 생각했다. 실제 수치로도 티가 나는지 확인해보았다. Android Studio를 설치하면 제공되는 Profiler에서 이것저것 관찰해봤다. 우선 Profiler를 써보면서 신기했던 점은 이렇다. - CPU, Memory, Network, Energy 에 대한 정보를 `간략하게` 또는 `클릭해서 상세하게` 볼 수 있다. - 현재 어떤 activity를 보는지 알려준다.(처음보는 앱 분석할 때 유용할지도..?) - 같은 앱이라도 킬 때마다 사용 메모리 크기는 매번 달랐다. 테스트한 것은 아래와 같다. 1. CPU 성능 (RecyclerView에서) Jetpack Paging vs ListAdapter ListView 와 Paging+RecyclerView를..

Programming/Android 2021.09.04

Android Jetpack Paging 3 적용하기

아래는 공식문서의 Paging 3 개요 일부이다. `Repository` 에서는 PagingSource와 RemoteMediator 둘 중 하나를 쓰면 된다고 이해했다. 이중에서 나는 PagingSource를 사용했다. 하지만 만약 네트워크 연결이 불안정하거나 오프라인 상태에서도 데이터를 로드하기 위해서라면 RemoteMediator가 적절하다. `ViewModel`에서는 Pager() 를 통해 PagingSource 객체를 생성하고 이를 UI(Activity등) 에서 반응할 수 있게 한다. 'PagingDataAdapter`는 RecyclerView에서의 Adapter + ListAdapter 를 상상하면 된다. 1. PagingSource 코드는 아래와 같다. load()에서는 네트워크 통신을 포함한..

Programming/Android 2021.09.03

코루틴은 race condition이 발생하지 않는 것일까?

C, JAVA의 멀티 쓰레드에서 비동기 처리에서는 공유변수에 대한 접근제어를 해왔었다.(세마포어, 뮤텍스, synchronized , etc.) 동기화 제어를 제대로 하지 않으면 원자성에 위배되어, 변경된 데이터의 손실이 일어날 수 있다. 그런데 코틀린 코루틴에 대해 배우면서 아직까지 race condition에 대한 언급은 한 번도 못봤던 것 같다. 서로 다른 coroutineScope에서 공유 변수에 대한 update가 동시에 발생할 때 문제가 생길 가능성은 전혀 없는 것일까? 결론부터 말하자면 멀티스레드와 마찬가지로 동기화 제어를 해주어야 한다. 각 쓰레드는 JVM의 Stack 영역을 차지하고, 코루틴은 각각의 작업이 Object로 할당되어 JVM의 Heap에 적재된다. 하지만 Heap영역이라고 해..

Programming/Android 2021.06.16

[Android] Koin + Unit Test 하기

개발에서 TDD라는 유명한 용어가 있다. Test Driven Development의 약자로서 테스트를 먼저 만들고 테스트를 통과하기 위한 것을 짜는 것이다. TDD의 장점은 결함(버그)가 줄어들고, 코드 복잡도가 떨어진다는 것이다. 거의 완성해가는 프로젝트에서 Unit Test를 하는 것이 TDD라고는 할 수는 없다. 하지만 앞으로의 프로젝트를 진행하는데 TDD를 하는 방법을 익힐 수 있을 것이다. BlindCommunity2 앱(모두의 취준생커뮤니티2)에서 Unit Test를 진행하여 보았다. 안드로이드에서 테스트는 크게 아래와 같이 3가지의 단계가 있다. 1. UI Test 실제 디바이스나 에뮬레이터로 UI를 테스트하는 것이다. 2. Integration Test 개발자가 작성한 UI를 제외한 코드..

Programming/Android 2021.05.21

[Android] ViewPager2 + BottomNavigation 으로 Fragment 관리하기

Jetpack에서 나온 BottomNavigation은 Fragment 전환을 쉽게 도와준다. 지금까지 내가 쓰던 방식은 전환될 Fragment를 xml파일에서 를 썼었는데 바텀네비게이션을 클릭할 때마다 fragment를 재생성하는 단점이 있었다. Fragment을 가진 Activity에서 재생성 안하도록 제어하는 방법을 찾다가 ViewPager2를 알게 되었고, 이 문제를 쉽고 명료하게 해결해주었다. 우선 ViewPager의 dependency를 추가해야 한다. implementation "androidx.viewpager2:viewpager2:1.0.0" 1. BottomNavigation에 사용될 menu를 정의한다. 2. activity의 layout을 정의한다. ViewPager2와 Bottom..

Programming/Android 2021.05.16

[Android] Recyclerview에 ListAdapter사용하기

지금까지 내가 안드로이드에서 리스트뷰를 구현했던 학습 과정은 아래의 순서였다. 기본 ListView Custom ListView RecyclerView DataBinding한 RecyclerView 이제 다음 단계는 ListAdapter를 이용한 RecyclerView 구현이다. 위의 4번을 베이스로 ListAdapter를 활용하는 것을 적어보겠다. 위의 2번과 3번의 차이가 Item 내에 view에 데이터를 bind할 때 ViewHoloder패턴의 강제 적용 유무였다면, ListAdapter를 사용한 RecyclerView는 Item 업데이트가 있을 때 이를 변경된 부분만 자동으로 탐지해서 notify 해준다. ListAdapter에서는 List를 저장하는 자료구조를 따로 만들지 않아도 된다. 어댑터 ..

Programming/Android 2021.04.29

MVVM에서 ViewModel의 Event 전달하기2(Event Wrapper)

지난 포스팅의 외국인 개발자분에게 보낸 메일에 답장은 오지 않았다. 하지만 답장 받기도 전에 내가 Event Wrapper에 대해 오해하고 있다는 것을 알게 되었다. 이벤트 발생시 마다 Event객체를 생성하는게 아닐 것이라 생각했지만 그건 큰 오산이었다. viewModel이 생성된 이후 단 한번만 발생시키는 이벤트에 사용되는 것이 Event Wrapper가 아니라 하나의 이벤트에 대해 liveData를 observing하는 View가 이벤트를 중복으로 처리하지 못하게 하는 것이다. 한 마디로 Event Wrapper의 용도에 대해 착각하고 있었다. 이벤트 발생시 마다 Event 객체를 만들어 LiveData에 넣어야한다. 역시 외국인 개발자 아저씨가 맞았다!! Event Wrapping은 특수한 상황에..

Programming/Android 2021.04.28

MVVM에서 ViewModel의 Event 전달하기(Event Wrapper)

MVVM Architecture에서 기본 개념 중 하나는 View는 ViewModel을 알지만, ViewModel은 View를 알지 못하게 하자는 것이다. 그로인해 ViewModel은 로직에 집중할 수 있게 된다. AAC ViewModel에서 작업이 끝나면 LiveData를 통해 observing하는 View가 이를 처리할 수 있게 된다. ViewModel에서 View의 메소드를 가진 인터페이스를 통해 이벤트를 전달했었는데 좋지 않은 방법이라는 것을 깨닫고 LiveData로 이벤트를 핸들링하는 방법을 알게 되었다. 이는 이벤트를 상태의 일부로 처리하는 것이다. liveData가 변경될 때 마다 호출 되는 것이 원래 목적이라면 하던대로 LiveData로 하면 된다. 그런데 Snackbar/Toast 메세지..

Programming/Android 2021.04.27