만약 당신이 이 세계에 발을 들여놓으려 한다면 Kotlin을 사용한 반응형 프로그래밍아마 눈치채셨겠지만, 모든 워크플로가 똑같이 작동하는 것은 아닙니다. 잘 모르시는 분들을 위해 설명드리자면, 워크플로가 누군가 호출할 때까지 기다리는 "정적" 워크플로인지, 아니면 아무도 보고 있지 않을 때에도 지속적으로 데이터를 생성하는 "동적" 워크플로인지에 따라 구분됩니다. 이러한 워크플로를 효과적으로 관리하는 것이 앱의 속도를 극대화하는 비결입니다. 그렇지 않으면 앱이 기기 메모리를 과도하게 소모하게 됩니다.
이 글에서는 기본 냉각 흐름에서 가열 흐름으로 전환하는 방법을 자세히 설명합니다. 상태 및 공유됨이론에만 머무르지 않고, ViewModel에서 실제로 어떻게 구현하는지, 그리고 가장 중요한 것은 데이터가 예상대로 출력되지 않을 때 단위 테스트가 악몽으로 변하는 것을 어떻게 방지하는지 살펴보겠습니다.
냉류와 온류의 차이점 이해하기
좋은 시작을 위해서는 콜드 플로우가 스포티파이에서 재생 버튼을 누를 때마다 0초부터 시작하는 노래와 같다는 것을 이해해야 합니다. 즉, 각 수집기는 고유한 시퀀스를 받습니다. 이들은 데이터를 독립적으로 처리합니다. 데이터베이스 쿼리와 같이 누군가가 듣고 있을 때만 실행하면 되는 리소스 집약적인 작업에 이상적입니다.
반면에 Hot Flows는 라디오 방송국과 더 비슷합니다. 라디오를 켜놓았는지 여부와 관계없이 음악이 재생됩니다. 여기서는, 여러 구독자가 동일한 스트림을 공유합니다. 데이터 관리에 필수적입니다. 사용자 인터페이스의 상태를 관리하거나 애플리케이션의 여러 부분에 동시에 전달해야 하는 이벤트를 트리거해야 할 때 매우 중요합니다.
StateFlow: 국가의 수호자
StateFlow는 특정 상태를 유지하는 데 특화된 핫 플로우의 한 유형입니다. 주요 특징은 다음과 같습니다. 항상 최신 값을 유지합니다.이러한 특징 덕분에 안드로이드에서 기존 LiveData를 대체하기에 완벽한 도구입니다. 제대로 작동하려면 생성자에 초기값이 필요하며, 이를 통해 UI에 항상 표시할 내용이 있게 됩니다.
ViewModel을 사용할 때는 일반적으로 내부적으로 값을 변경하기 위해 비공개 MutableStateFlow를 사용하고, 뷰가 읽기만 할 수 있도록 공개 StateFlow를 노출합니다. 이 점을 기억하는 것이 중요합니다. StateFlow는 배출량을 결합합니다.값이 너무 빠르게 변하면 수집기는 일부 중간 상태를 건너뛰고 최신 값만 수신할 수 있으며, 이는 사용자 인터페이스 측면에서 효율적입니다.
SharedFlow: 글로벌 이벤트 방송 플랫폼
이전 버전과 달리 SharedFlow는 기본적으로 현재 상태를 저장하지 않지만, 다음과 같은 용도로 사용됩니다. 여러 구독자에게 이벤트를 방송합니다.사용자가 로그아웃했음을 앱 전체에 알려야 한다고 가정해 보세요. SharedFlow는 다음과 같은 설정을 할 수 있기 때문에 이상적인 옵션입니다. 재생이는 신규 구독자에게 전송되는 기존 값의 수를 정의합니다.
또한, 파라미터를 통해 배압을 완벽하게 제어할 수 있습니다. onBufferOverflow버퍼가 가득 찼을 때 발신자를 일시 중단할지, 아니면 프로그램 실행이 차단되는 것을 방지하기 위해 가장 오래된 항목이나 가장 최근 항목을 버릴지 결정할 수 있습니다.
stateIn과 sharedIn을 사용하여 콜드 플로우를 변환합니다.
때때로 유지 관리 비용이 매우 많이 드는 콜드 플로우(예: 지속적인 네트워크 연결)가 있는데, 각 가입자가 새로운 연결을 설정하는 것을 원하지 않습니다. 바로 이럴 때 통신 사업자가 필요합니다. 주(state)이 연산자는 콜드 플로우를 공유 핫 스테이트플로우로 변환합니다. 이 연산자에는 다음이 필요합니다. 코루틴스코프 그리고 창업 전략.
구성 공유 시작됨 핵심은 다음과 같습니다: Lazily 수집은 첫 번째 구독자부터 시작되며 멈추지 않습니다. WhileSubscribed 안드로이드 사용자에게 가장 현명한 선택입니다. 왜냐하면... 데이터 생성을 중지합니다. 아무도 듣고 있지 않을 때(예: 앱이 백그라운드에서 실행 중일 때) 배터리와 메모리를 절약할 수 있습니다.
StateFlow 대신 SharedFlow가 필요한 경우 사용할 연산자는 다음과 같습니다. 공유하기이 방법은 유사하게 작동하지만 더 유연하며, 매개변수를 사용하여 흐름의 새 구성원에게 전달해야 하는 요소의 수를 정확하게 정의할 수 있습니다. 재생.
고온 유동에 대한 테스트 전략
이러한 흐름을 테스트하는 것은 까다롭습니다. 테스트 대상이 흐름의 관찰자인 경우, 다음과 같은 방법을 사용하는 것이 가장 좋습니다. 가짜 구현 제어된 값을 내보내는 저장소에서 가져옵니다. 모듈이 흐름을 노출하는 경우 다음과 같은 함수를 사용할 수 있습니다. first() 첫 번째 문제를 검증하기 위해 또는 toList() 유한 흐름의 경우.
흔히 발생하는 문제점 stateIn 즉, 우리가 사용한다면 WhileSubscribed수집기가 없으면 유량이 활성화되지 않아 테스트가 실패할 수 있습니다. 이를 해결하려면 다음을 수행해야 합니다. 빈 수집기를 시작합니다 에 backgroundScope 테스트 과정에서 운영자가 활성화되어 값을 업데이트하는지 확인합니다. 프로세스를 간소화하기 위해 라이브러리 사용을 권장합니다. 터빈이를 통해 배출량을 순차적으로, 훨씬 더 자연스러운 방식으로 검증할 수 있습니다.
- StateFlows의 경우, 속성을 직접 검증하는 것이 좋습니다. 가치 흐름을 수집하는 대신, 빠른 값들을 결합할 때 발생하는 문제를 방지합니다.
- 사용하는 것이 필수적입니다 제한되지 않은 테스트 디스패처 테스트에서 데이터가 발행되기 전에 수집 코루틴이 준비되었는지 확인하기 위해서입니다.
stateIn과 sharedIn을 올바르게 적용하여 콜드 플로우와 핫 플로우 간의 전환을 완벽하게 제어하면 안드로이드에서 훨씬 더 견고한 아키텍처를 구축할 수 있으며, 리소스 소비를 최적화하고 비즈니스 로직과 사용자 인터페이스 간의 데이터 동기화를 완벽하고 쉽게 테스트할 수 있습니다. 더 많은 사람들이 주제에 대해 알 수 있도록 이 정보를 공유하세요.