Android Flow
사용 언어: Kotlin 1.8.10
사용 버전: Android Studio Electric Eel 2022.1.1 Patch 2
Android Flow는 데이터의 변화를 확인하기 위해 만들어졌습니다.
2021년에 나왔나 보네요. 아래 동영상입니다.
https://www.youtube.com/watch?v=fSB6_KE95bU
사용 버전: Android Studio Electric Eel 2022.1.1 Patch 2
Android Flow를 알아보겠습니다.
Android Flow는 데이터의 변화를 확인하기 위해 만들어졌습니다.
2021년에 나왔나 보네요. 아래 동영상입니다.
https://www.youtube.com/watch?v=fSB6_KE95bU
Pancho가 등장합니다. 이 판초는 물을 뜨러 다니는 게 일입니다.
물(데이터)를 뜨러 다니는 Pancho.
너무 귀찮은데, 어떻게 해야 할까?
Flow를 잘 설명하는 그림이었습니다.
저는 2023년 지금 처음 보는데요. 당시 개발자들이 열광했겠다는 생각이
드네요. 엄청 편해졌겠어요.
아래는 Flow 문서입니다.
Flow는 데이터의 변화를 체크하는 것이 아니라, 뚫린 관으로 데이터를 계속
받는 겁니다. 즉, 그냥 관을 뚫어서 연결합니다. 데이터가 있으면 관을 타고
내려올 것이고 받는 쪽은 새로운 데이터만 받으면 됩니다. 데이터가 없다면
아무것도 안 내려오겠죠?
저도 Pancho처럼 쉽게 살아봅시다.
제 앱은 설정이 존재하고, 설정이 변경되면 UI가 같이 변하는 구조입니다.
이 구조를 만드느라고 liveData를 엄청 많이 만들고, Fragment가 다시 실행될
때, viewModel을 다시 가동하는 구조로 만들었습니다. Room Database는
테이블에 추가되거나 삭제된 것은 LiveData가 잘 포착하지만, 구성 요소가
업데이트되는 경우는 포착하지 못하더군요.
저기 126 번째 줄을 보면 viewModel.initSetting()이 setting이 혹시나
변경되었나 싶어서 부르는 부분입니다.
자, 이 코드를 flow를 사용해서 좀 편하게 만들어 봅시다.
저는 Room Database를 사용하기 때문에 Flow를 반환하는 Query를 하나 만들어
줬습니다.
Flow 만드는 건 쉽습니다.
위에는 커스텀이고, 그냥 flow{}로 만들어주면 됩니다. flow를 만들어야
하는데, Room Database에서 이미 만들어줍니다. 반환 타입이
Flow<SettingInfo>니까요.
우리는 사용만 하면 됩니다.
ViewModel에 settingFlow라는 변수를 만들고 database에서 바로 방금 만든
getSettingInfoFlow()를 받습니다.
그리고 Fragment로 가서 collect를 해줍니다. collect는 coroutine이기 때문에
lifecycleScope.launch가 필요합니다.
이렇게 하면, 끝인 것 같지만, 다시 등장한 Pancho. 샤워 중입니다.
lifecycle이 살아있는 동안 계속해서 Collect 되기 때문에 이것을 해결하기
위해 특정 lifecycle에만 작동하도록 만들어야 합니다.
repeatOnLifecycle()을 사용해서 특정 State 이후에만 작동되도록 만듭니다.
이렇게 하면 끝입니다.
그런데, Fragment에서는 문제가 발생합니다.
Fragment 전환 후, 다시 돌아오면 collect가 중복되어서 실행됩니다.
그래서 이러한 방법보다는 그냥 .asLiveData를 사용합시다.
이제, flow로 변경된 코드를 볼까요?
처음에 다시 불러오던 코드가 없어졌습니다.
카테고리: Android
댓글
댓글 쓰기
궁금한 점은 댓글 달아주세요.
Comment if you have any questions.