Flow로 LiveData를 어떻게 대체할 수 있을까?

Flow와 LiveData의 차이점

  • Flow는 collect할 때마다 새로 생성된다.
  • Flow는 액티비티의 생명 주기를 고려하지 않는다(액티비티가 파괴되어도 계속 실행된다).

생명 주기 반영하기

  1. 생명 주기 메서드 직접 이용하기.
     val job: Job? = null
        
     overide fun onStart() {
         super.onStart()
         job = exampleFlow.collect {
             // collect data
         }.launchIn(lifeCycleScope)
     }
        
     overide fun onStop() {
         super.onStop()
         job?.cancel()
     }
    


  2. repeatOnLifecycle() 이용하기.
    • Suspend Function.
    • Coroutine Scope 내부에서 호출할 수 있다.
     lifecycleScope.launch {
         repeatOnLifecycle(Lifecycle.State.STARTED) {
             exampleViewModel.exampleFlow
             // collect data
         }
     }
    


  3. flowWithLifecycle() 이용하기.
    • NOT Suspend Function.
    • Lifecycle과 연동되는 Flow를 반환한다. 별도의 Coroutine Scope를 통해 구독해야 한다.
     lifecycleScope.launch {
         exampleViewModel.exampleFlow
             .flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)
             .collect { 
                 // collect data 
             }
     }