LiveData, Flow 차이

Ddudduu·2025년 2월 20일
0
post-thumbnail

LiveData

  • 관찰 가능한 데이터 홀더 클래스
  • Activity, Fragment, Service 등 앱 구성요소의 수명 주기를 인식 => 수명 주기 상태에 있는 요소의 observer만 업데이트한다.
  • 수명 주기가 끝나는 즉시, 값을 관찰하지 않기 때문에 메모리 누수를 걱정할 필요가 없다!
  • Observer 패턴을 따르기 때문에 데이터가 변경되면, Observer 객체에 알린다
    => Observer 객체에 UI 업데이트

앱 아키텍처에서의 사용법

  • ViewModel 은 데이터를 로드하고 조작하는 역할이기 때문에 LiveData 를 갖고있기에 적합하다.
  • ViewModel 에 LiveData 선언하고, Fragment(View) 에서는 observe 하며 UI 에 표시한다.

이전에 개발했던, 특정 아이템 북마크 하는 기능이다.

ViewModel

private val _isBookMarked = MutableLiveData(false)
val isBookMarked: LiveData<Boolean> = _isBookMarked

북마크 선택 여부를 저장하는 isBookMarked 변수를 ViewModel 에 선언한다.

Fragment
viewModel.isBookMarked.observe(viewLifecycleOwner) {
	binding.btnBookmark.isSelected = it
}

isBookMarked 를 observe 하며, 선택 여부에 따라 isSelected 표시를 처리한다.


단점

  • But!! 비동기 데이터 스트림을 처리하도록 설계되지 않음
    => Data Layer 에서 LiveData 를 쓰기 어려움
    (그래서 Data Layer 에서 Flow 로 데이터 생성하고, Presentation 에서는 LiveData 로 observe 하는 방법을 사용하는 게 아닐까?)

  • 모든 LiveDaata 객체가 메인 스레드에서 관찰된다




Flow

  • lifecycle 을 알지 못함
    => repeatOnLifeCycle 사용하면 해결 가능

  • 비동기적인 데이터 흐름
    (suspend function 사용하기 때문에 메인쓰레드 차단하지 않고 데이터 생성 가능)

  • 지속적으로 데이터를 방출한다 (emit)

  • 여러 값을 순차적으로 내보내기 때문에 DB에서 실시간으로 갱신된 값을 가져오는 데 적합하다.

  • Cold Stream 이란?
    1. flow scope 내부에서 데이터가 생성된다.

    flow{ 
    	for(i in 1..10){
        	delay(1000L)
            emit(i)
        }
    }
    		```
    

Flow

2.Producer가 발생한 데이터를 동시에 여러 Consumer 가 수신할 수 있다.
여러 Consumer가 같은 Producer를 구독하더라도, 각각 독립적으로 동작함.

  1. Consumer가 소비하는 시점부터 데이터를 생산한다.
    collect() 하는 시점부터!
CoroutineScope(Dispatchers.IO).launch {
	count.collect{
    	Log.d("Count: ", it.toString())
    }
 }
profile
Android

0개의 댓글