화면에 정보를 표시하지 않거나 백그라운드 상태에서는 flow 에서 데이터를 collect 하고있으면 안된다.
Rx 에서 누수방지를 위해 subscribe 를 해제 하듯이 flow도 필요할때만 collect를 해야된다.
만약 reapeatOnLifecycle
을 사용안하고, lifecycleScope
코루틴에서 직접 flow를 수집할경우 앱이 백그라운드에 진입하고 나서도 flow를 업데이트 하는 메모리 누수가 발생한다.
이러한 메모리 누수를 방지하려면 OnStop 이 발생하면 flow의 collect 를 중단하는 로직이 필요하다.
launchWhenStarted
: 앱이 백그라운드에 있을때, Flow 수집을 중단한다. (대신, flow 생산자를 계속 활성화 시켜놓고 있어 메모리 누수가 발생한다.)
안드로이드 Lifecycle과 연동하여 누수방지를 해주는 여러 라이브들이 있다.
Lifecycle-aware alternatives
Flow<T>.asLiveData(): LiveData
: 백그라운드 이동시 자동 관찰해제Lifecycle.repeateOnLifecycel(state)
Flow<T>.flowWithLifecycle(lifecycle, state)