lifecycleScope의 한계점 flow를 Activity의 lifecycleScope에서 사용하게 되면 Activity가 onDestroy 될 때 데이터 collect가 중단된다. 하지만 onDestroy는 Activity가 종료될 때 수행되고 Activity가 백그라운드로 내려갈 때 수행되지 않는다. 앱이 백그라운드로 내려가면 activity의 lifecycle은 onStop시 수행되므로 lifecycleScope의 collect는 계속해서 데이터를 수집하는 것이다. 참조 : [Android CoroutineScope] 1. Activity, ViewModel에서 올바른 CoroutineScope 사용법 : lifecycleScope과 viewModelScope의 활용 기존의 해결책 기존에는 이 ..
Coroutines
lifecycleScope 사용의 한계점 lifecycleScope만을 사용해 Coroutine Job을 사용하는 것은 한계점이 있다. 바로 onDestroy 시 Job이 cancel된다는 것이다. onDestroy 시 job이 cancel 된다는 것은 백그라운드로 내려가는 onStop이 일어났을 때 여전히 Job이 수행됨을 뜻한다. 즉, Activity를 finish 시키는게 아니라. 홈버튼을 눌러 onStop만 되었더라면 Activity에서는 여전히 데이터를 수집하게 된다. 이러한 불필요한 동작은 백그라운드로 내려간 앱의 메모리 사용량을 증가시켜 시스템에 의한 Crash를 만들어낼 수도 있고, 사용자가 원치 않는 데이터 사용이 일어나도록 만들 수도 있다. lifecycleScope 문제 예시 아래와 ..
루틴이란 무엇인가? 우리는 Routine을 운동 루틴 혹은 공부 루틴과 같은 '특정한 일을 하기 위한 일련의 처리 과정'이란 뜻으로 사용한다. 비슷하게 전통적으로 프로그래밍에서는 루틴을 '특정한 일을 처리하기 위한 일련의 명령'으로 사용해 왔다. 실제로 구글에 routine을 찾으면 아래와 같이 나온다. 루틴(Routine)이란 컴퓨터 프로그램의 일부로써 특정한 일을 실행하기 위한 일련의 명령이다. 우리는 프로그래밍에서 이러한 일련의 명령을 함수라 부른다. 자 이제 서브루틴(Sub-Routine)에 대해 알아볼 준비가 되었다. 서브루틴이란 무엇인가? 프로그래밍에서는 함수 안에 함수가 있을 경우 바로 안쪽의 함수를 서브루틴이라 부른다. 예를 들어 아래와 같은 코드가 있다고 해보자. fun routine1(..
Android에서 올바른 CoroutineScope를 사용해야 하는 이유 CoroutineScope는 Coroutine Job이 실행되는 Scope이다. CoroutineScope가 해제되면 CoroutineScope에 속한 Coroutine Job들은 모두 해제된다. 따라서 만약 CoroutineScope이 안드로이드 구성요소(Activity, ViewModel)의 Lifecycle에 따라 올바로 할당 해제되지 않는다면 해제되어야 하는 Job들이 계속해서 동작해서 Memory Leak으로 이어진다. 예를들어 App의 Lifecycle동안 유지되는 GlobalScope를 1초마다 string을 내보내는 flow를 collect하기 위해 사용해보자. class MainActivity : ComponentA..
Coroutine의 Flow는 데이터 스트림이며, 코루틴 상에서 리액티브 프로그래밍 지원 하기 위한 구성요소이다. 이를 이해하기 위해서는 먼저 리액티브(반응형) 프로그래밍이 무엇인지, 그리고 Flow가 리액티브 프로그래밍에 대응하여 어떠한 역할을 하는지를 알아야 한다. 리액티브 프로그래밍이란? 리액티브 프로그래밍이란 데이터가 변경 될 때 이벤트를 발생시켜서 데이터를 계속해서 전달하도록 하는 프로그래밍 방식을 뜻한다. 이는 기존의 명령형 프로그래밍과 대응되는 개념인데 이에 대한 내용은 [RxJava] 반응형 프로그래밍 이해하기 글에 잘 설명되어 있다. 만약 리액티브 프로그래밍에 대해 잘 모른다면 위 글을 읽고 오자. 기존 명령형 프로그래밍에서는 데이터의 소비자는 데이터를 요청한 후 받은 결과값을 일회성으로..