Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Flow 느껴보기
Search
DavidKwon7
May 13, 2023
Programming
1
110
Flow 느껴보기
- KotlinConf'23 Global in SongDo 발표 자료 입니다.
- 2023년 5월 13일
DavidKwon7
May 13, 2023
Tweet
Share
More Decks by DavidKwon7
See All by DavidKwon7
Jetpack Glance
davidkwon7
0
110
Refactoring to Expressive Kotlin
davidkwon7
0
560
UI Test with Compose
davidkwon7
0
130
Relay_및_Compose를_사용하여_완전한_앱_빌드하기.pdf
davidkwon7
0
430
WearOS 101
davidkwon7
0
42
Other Decks in Programming
See All in Programming
Creating a Free Video Ad Network on the Edge
mizoguchicoji
0
150
今からはじめるAndroidアプリ開発 2024 / DevFest 2024
star_zero
0
450
社内活動の取り組み紹介 ~ スリーシェイクでこんな取り組みしてます ~
bells17
0
370
.NET のための通信フレームワーク MagicOnion 入門 / Introduction to MagicOnion
mayuki
1
3k
ペアーズにおけるAmazon Bedrockを⽤いた障害対応⽀援 ⽣成AIツールの導⼊事例 @ 20241115配信AWSウェビナー登壇
fukubaka0825
6
2.3k
AWS AppSyncを用いた GraphQL APIの開発について - NIFTY Tech Talk #22
niftycorp
PRO
0
110
チームにとって最適なスキルアップ施策とは何か/what-is-the-best-skill-up-approach-for-team
nobuoooo
0
160
「今のプロジェクトいろいろ大変なんですよ、app/services とかもあって……」/After Kaigi on Rails 2024 LT Night
junk0612
5
2.2k
デザインパターンで理解するLLMエージェントの作り方 / How to develop an LLM agent using agentic design patterns
rkaga
11
2.3k
Modular Monolith Monorepo ~シンプルさを保ちながらmonorepoのメリットを最大化する~
yuisakamoto
10
3.7k
PaaSとSaaSの境目で信頼性と開発速度を両立する 〜TROCCO®︎のこれまでとこれから〜
gtnao
5
5.8k
.NET Conf 2024の振り返り
tomokusaba
0
170
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
760
Code Review Best Practice
trishagee
64
17k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
250
21k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Designing for humans not robots
tammielis
250
25k
Transcript
Flow 느껴보기 - kotlinConf 2023
권혁준 Android Developer GDG Incheon Organizer 스파이더 크래프트 Android Developer
목차 1. Coroutine Flow 소개 2. Flow Operator 3. StateFlow
/ SharedFlow (kotlinConf recap) 4. Flow with compose (kotlinConf recap)
Coroutine Flow 소개
Flow는 무엇일까요?
Coroutine Flow 소개
Coroutine Flow 소개
Coroutine Flow 소개 비동기적으로 처리되는 데이터 스트림 생성 및 처리
앱의 반응성 유지 데이터를 생산 (emit)하는 오퍼레이터와 소비(collect) 하는 오퍼레이터 비동기 코드를 동기적인 코드처럼 작성할 수 있다 데이터를 비동기적으로 처리하고 UI를 업데이트 하는 등의 활용 오퍼레이터를 연결하여 데이터 파이프라인 생성
Coroutine Flow 소개 데이터 스트림 생산 및 소비를 하는 경량화된
비동기 스레드.
Coroutine Flow 소개 안드로이드 공식문서에서는 flow를 ‘여러 값을 순차적으로 내보낼
수 있는 유형’ 이라고 소개하고 있습니다. - 생산자 : 스트림에 추가되는 데이터 생산 - 중개자(선택사항) : 값이나 스트림 자체 수정 - 소비자 : 스트림 사용
Coroutine Flow 소개
None
None
scope / builder 소개
Coroutine Flow 소개 Flow는 비동기적으로 처리되는 스트림 형태의 데이터로 ‘생산자
/ 중개자 / 소비자’ 의 형태로 파이프 라인을 형성하여 효율적으로 데이터 처리 및 반응형 UI를 생성할 수 있다.
Operator of Flow
Operator of Flow - merge merge를 사용하여, 2개 이상의 스트림을
하나의 스트림으로 합쳐줄 수 있습니다. 2개의 스트림이 나누어진 상태에서 합쳐지는 것이 아닌, 시간의 흐름에 따라 정렬되는 형식을 취합니다.
Operator of Flow - merge suspend fun main() { val
ints: Flow<Int> = flowOf(1, 2, 3).onEach { delay(100) } val doubles: Flow<Double> = flowOf(0.1, 0.2, 0.3).onEach { delay(50) } val together: Flow<Number> = merge(ints, doubles) print(together.toList()) }
Operator of Flow - combine combine을 사용함으로써 2가지 이상의 flow
간의 결합이 가능해지기 때문에, 2가지 이상의 데이터를 효과적으로 처리해줄 수 있습니다.
Operator of Flow - combine combine @JvmName(name = "flowCombine") fun
<T1, T2, R> Flow<T1>.combine (flow: Flow<T2>, transform : suspend (T1, T2) -> R): Flow<R> val flow = flowOf(1, 2).onEach { delay(10) } val flow2 = flowOf("a", "b", "c").onEach { delay(15) } flow.combine(flow2) { i, s -> i.toString() + s }.collect { println(it) // Will print "1a 2a 2b 2c" }
Operator of Flow - zip zip은 combine과 유사한 operator입니다. 차이점은
결합을 하게 되는 경우 발행하는 이벤트의 횟수가 동일하게 맞춰진다는 특징이 존재합니다.
Operator of Flow - zip
Operator of Flow - reduce reduce의 프로퍼티는 accumulator, value 가
존재합니다. accumulate는 누적된 값을 보여주고, value는 이후에 연산이 진행될 값을 보여줍니다.
Operator of Flow - reduce
Operator of Flow - fold fold는 reduce와 유사한 기능을 가지고
있습니다. 동일하게 accumulate, value를 사용합니다. 차이점은 fold의 경우 fold의 파라미터에 처음 연산 값을 넣어줄 수 있다는 것입니다.
Operator of Flow - fold
Operator of Flow - scan scan은 fold와 유사하게 결과값을 누적해주는
기능이 있지만, 리스트 형태로 중간 결과값을 모두 가지고 있다는 특징이 있습니다.
Operator of Flow - scan
Operator of Flow - buffer buffer를 사용함으로써 기존의 발행/소비 패턴과
다르게, 데이터 abc 발행 후 데이터 abc 소비하는 형태로 flow를 변경해줄 수 있습니다.
Operator of Flow - buffer
Operator of Flow - map / filter map을 통해 데이터를
변환할 수 있습니다. filter를 사용하면 조건에 맞는 데이터만 넘겨줄 수 있습니다.
Operator of Flow - map / filter
Operator of Flow - take take 파라미터 안의 수만큼 소비하며
그 이후에 flow는 cancel 됩니다
Operator of Flow - take
Operator of Flow - drop drop을 사용하면 작성된 숫자만큼의 값들의
수를 넘길 수 있습니다.
Operator of Flow - drop
kotlinConf 2023 Recap
SharedFlow / StateFlow KotlinX Libraries Recap!
SharedFlow / StateFlow 상황에 맞춰 다양한 Flow를 사용한 것을 확인할
수 있습니다.
SharedFlow / StateFlow SharedFlow - 수집(collect)하는 모든 소비자에게 값을 보내줄
수 있다. - 처음 값 구독 시작했을 때는 처음 방출 데이터를 갖지 못한다. - 같은 값을 연속적으로 방출하게 되는 경우 두 값 모두 collect한다.
SharedFlow / StateFlow StateFlow - 현재 상태와 새로운 상태 업데이트를
수집기(collector)에 내보내는 역할을 수행할 수 있다. - 처음 구독 시작 시, 처음 방출 데이터를 갖는다. - 같은 값을 연속적으로 방출하게 되는 경우 처음 값만 collect한다.
SharedFlow / StateFlow
SharedFlow / StateFlow
SharedFlow / StateFlow
SharedFlow / StateFlow
Flow / SharedFlow / StateFlow
Flow / SharedFlow / StateFlow Cold Flow : collector가 방출된
데이터를 수집할 때마다 새로운 데이터 스트림 생성하므로 collector들은 각각의 개별적인 데이터 스트림에서 데이터 수집합니다. Hot Flow : collector들이 데이터 스트림을 공유하여 동일한 데이터를 수집하며, 기본적으로 collector가 없어도 데이터 방출합니다. 다수의 구독자가 동일한 스트림을 전달받을 수 있습니다.
Flow / SharedFlow / StateFlow
Flow / SharedFlow / StateFlow
Flow / SharedFlow / StateFlow
SharedFlow / StateFlow
Flow with Compose Avoiding common Coroutines mistakes in compose Recap!
Flow with Compose
Flow with Compose
collectAsState Compose는 value의 변화를 자체적으로 파악하지 못 합니다. 그렇기에 새로운
flow 값의 방출이 일어날 때마다, compose state 형태로 값의 변화를 업데이트를 해준다.
collectAsStateWithLifeCycle collectAsState에 LifeCycle이 더해진 compose api 입니다. 이를 통해 생명
주기에 맞춰 flow를 수집할 수 있게 됩니다.
collectAsState는 lifeCycle에 종속되지 않는다는 장점이 있습니다. 그렇기에 Android 앱이 백그라운드에
있는 동안 recomposition을 중지하더라도, 계속해서 작업을 진행할 수 있기에, 백그라운드 상태에서도 작업을 진행할 수 있습니다.
Flow with Compose
Flow with Compose
Flow with Compose
Flow with Compose
참고 자료 - KotlinConf : https://kotlinconf.com/talks/ - 안드로이드 공식 문서
https://developer.android.com/kotlin/flow?hl=ko
질문은 상단의 QR 코드를 이용해주세요!
감사합니다