Android의 StateFlow, SharedFlow를 알아보자

312·2024년 5월 30일

Android 알아보기

목록 보기
7/7

What is StateFlow?

(StateFlowSharedFlow는 흐름에서 최적으로 상태 업데이트를 내보내고 여러 소비자에게 값을 내보낼 수 있는 Flow API이다.)

StateFlow가 사용되기 이전에는 LiveData 클래스를 사용해서 데이터 갱신을 수집했었다.

LiveDataObservable한 데이터 홀더 클래스이기 때문에 Observe 하는 클래스에서 데이터의 변경을 감지하고 상태를 업데이트하는데 사용되었다.

같은 역할을 StateFlow도 수행하는데 왜 StateFlow가 등장했는지 알아보자.

Why Not LiveData?

  • LiveData 는 AAC 라이브러리이기 때문에 의존성을 갖지 않아야 하는 클린 아키텍처의 Domain Layer에서는 사용할 수 없다.

  • LiveDataMain Thread에서만 동작할 수 있기 때문에 비동기 처리에 한계가 있다.

    MediatorLiveData, Transformations, Coroutines와 같은 추가적인 도구를 사용해야 한다.

이러한 단점은 StateFlow 의 등장 배경이 되었다..!

What's new in StateFlow, SharedFlow?

Flow가 등장함에 따라서 LiveData의 대체 가능성이 생겼고,

StateFlow, SharedFlow이 함께 등장해서 LiveData를 완전히 대체 할 수 있게 되었다.

StateFlowSharedFlow 둘 다 HotStream을 기반으로 Collect() 이후부터 데이터를 가져올 수 있다.
StateFlow

  • 초기값이 존재한다.
  • value속성을 이용해 값을 방출한다.
  • flow를 공유할 수 있으며 항상 최신 값(마지막 데이터 값)을 받는다.
  • 내부적으로 값이 같을 경우 갱신하지 않는다.
  • 효율적이고 API가 더 간단하므로 상태관리에 잘 어울린다.

SharedFlow

  • 초기값이 없어도 된다.
  • replayCache를 통해 collect시 전달받을 이전 데이터의 개수와 캐싱 여부까지 정의할 수 있다.
  • 시간에 따라 동일한 이벤트를 트리거하는 경우에 더 적합하게 동일한 값을 재방출한다.

How To StateFlow?

로딩화면에 적용한 예시이다.

_isLoading을 변경가능하게 private로 선언해서 외부에서 접근할 수 없게 만들고 isLoading으로 데이터를 발행해서 변경되는 값을 최신으로 구독할 수 있게 만들었다.

How To SharedFlow?

로딩화면을 SharedFlow로 다시 만들어봤다.

  • replay는 새로운 구독자들에게 이전 이벤트의 방출 여부 (0 미방출 1 방출)
  • extraBufferCapacity는 추가 buffer 생성 여부 (1 생성)
  • OnBufferOverflow는 버퍼 초과시 처리 여부 (DROP_OLDEST = 가장 오래된 데이터 drop)

결론

StateFlowLiveData의 대체 데이터 홀더 클래스
SharedFlow는 Flow의 기능을 활용한 디테일한 데이터 홀더 클래스

profile
안드로이드 개발자 이상일입니다.

0개의 댓글