Android Flow

사용 언어: Kotlin 1.8.10
사용 버전: 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

댓글

이 블로그의 인기 게시물

Python OpenCV 빈 화면 만들기

Python urllib.parse.quote()

Python bytes.fromhex()

Android AVD Ram size change

Forensics .pyc 파일 .py로 복구하기

Android Minimum touch target size

KiCad 시작하기 7 (FreeRoute 사용하기 2)

Android Notification with Full Screen

C++ OpenCV 모폴로지 침식, 팽창

KiCad 시작하기 2 (PCB 만들기)