Slide 1

Slide 1 text

Kotlin Coroutines ͜ͱ͸͡Ί

Slide 2

Slide 2 text

ࣗݾ঺հ • w ழມॆԝ ͍ͷ·ͨΈͭͻΖ w ᷂UFDIWFJO୅දɻ
 J04"OESPJEεϚϗΞϓϦΤϯδχΞɻ
 3Y͕޷͖Ͱ͢ɻ w QSJWBUFUXJUUFS!JOP

Slide 3

Slide 3 text

ࠓ೔ͷ࿩ • Kotlinίϧʔνϯͷجຊͱ࢓૊ΈΛ஌Ζ͏

Slide 4

Slide 4 text

ҰൠతʹɺCoroutine ͱ͸ • தஅɾ࠶։͕Մೳͳαϒϧʔνϯ • ฒߦੑ(Concurrent)Λఏڙ͢Δ

Slide 5

Slide 5 text

αϒϧʔνϯʹී௨ͷؔ਺(ͳͲ) αϒϧʔνϯ ؔ਺ͳͲ ॲཧ ॲཧ ॲཧ ʜ SFUVSOl)FMMP 8PSMEl ϝΠϯॲཧ αϒϧʔνϯ։࢝ ʜ αϒϧʔνϯऴྃ

Slide 6

Slide 6 text

ίϧʔνϯʹதஅՄೳͳαϒϧʔνϯ ίϧʔνϯ ॲཧ ZJFMElIFMMPz ॲཧ ZJFMElXPSMEz ॲཧ ʜ ϝΠϯॲཧ ίϧʔνϯ։࢝ ʜ ίϧʔνϯऴྃ

Slide 7

Slide 7 text

ίϧʔνϯ͸ ฒߦ(Concurrent)ʹಈ࡞͢Δ εϨου" ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ εϨου# ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ

Slide 8

Slide 8 text

ฒߦ(Concurrent) ͱ ฒྻ(Parallel) • ฒߦ(Concurrent) ͷྫ: Coroutine • ฒྻ(Parallel) ͷྫ: ϚϧνεϨουɾϚϧνϓ ϩηε

Slide 9

Slide 9 text

ฒߦ(Concurrent) != ฒྻ(Parallel) εϨου" ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ͜Ε͸ฒߦͰ͋ͬͯ
 ฒྻͰ͸ͳ͍ ͜Ε͸ฒߦͰ΋
 ฒྻͰ΋͋Δ εϨου# εϨου" ίϧʔνϯ ίϧʔνϯ

Slide 10

Slide 10 text

Coroutines 
 are 
 light-weight.

Slide 11

Slide 11 text

Kotlin Coroutines

Slide 12

Slide 12 text

Kotlin Coroutine ͷΩϞ • Suspending Function • Structured concurrency • CoroutineContext • Async as Sync

Slide 13

Slide 13 text

Kotlin CoroutineͷΩϞᶃ
 Suspending Function

Slide 14

Slide 14 text

Suspending Function • Kotlin Coroutines ͸ɺίϧʔνϯͷதஅͰ͖ Δੑ࣭Λ suspend ؔ਺(Suspending Function)Ͱ࣮ݱ͍ͯ͠Δɻ

Slide 15

Slide 15 text

Suspending Function ͷੑ࣭ • suspend ؔ਺͸ଞͷ suspend ؔ਺ͷதͰ͔͠ ࣮ߦͰ͖ͳ͍ɻ • ࢠͷ suspend ؔ਺͕தஅ͢Δͱɺ਌ͷ suspend ؔ਺΋ࢭ·Δɻ • suspend ؔ਺ͷதͰී௨ͷؔ਺(suspendͰͳ ͍ؔ਺)ΛݺͿ͜ͱ͸Ͱ͖Δɻ

Slide 16

Slide 16 text

Hello world to Kotlin Coroutine

Slide 17

Slide 17 text

͜ͷαϯϓϧͰ࢖͍ͬͯΔؔ਺ • ίϧʔνϯϏϧμʔ(ੜ੒ؔ਺): • runBlocking { ... } • CoroutineScope#launch { ... } • suspendؔ਺:
 delay(timeMillis: Long) ※஫: runBlocking͸ཚ༻NGɻ
 ɹɹAndroid؀ڥͰ͸࢖Θͳ͍͜ͱʂ

Slide 18

Slide 18 text

Android ൛

Slide 19

Slide 19 text

CoroutineScopeΫϥε • ίϧʔνϯͷੜଘظؒΛ؅ཧ͢ΔΦϒδΣΫτɻ • MainScope ... UIεϨουͰಈ࡞͢Δείʔϓɻ 
 → AndroidͷActivity ͳͲͱඥ෇͚ͯը໘ͷ
 ɹϥΠϑαΠΫϧͱҰகͤ͞ΒΕΔɻ • GlobalScope ... ΞϓϦͷੜଘظؒͱಉ͡είʔϓɻ
 → όονॲཧͳͲɺΞϓϦੜଘதʹऴΘͬͯ͸ࠔΔॲཧΛ࣮ߦ͢Δɻ

Slide 20

Slide 20 text

αεϖϯυؔ਺ͷྫ • delay (timeMillis: Long) 
 ... ࢦఆϛϦඵ଴ͭɻ • withTimeout(timeMillis: Long) { ... } withTimeoutOrNull(timeMillis: Long) { ...}
 ... ϒϩοΫ಺ͷॲཧ͕ࢦఆϛϦඵΛ௒͑ͨͱ͖ʹ
 ɹλΠϜΞ΢τͤ͞Δɻ • yield() 
 ... ॲཧΛॠஅͯ͠ɺ(͋Ε͹)ଞͷίϧʔνϯʹॲཧΛճ͢ɻ

Slide 21

Slide 21 text

suspend ͸ϊϯϒϩοΩϯά • suspend = தஅ • ͚ͩͲɺεϨουΛϒϩοΫ͠ͳ͍ • →εϨουΛϒϩοΫ͢Δྫ: Thread.sleep()

Slide 22

Slide 22 text

Coroutine ͷ suspend ؔ਺͸ॲཧΛதஅͯ͠ɺ ଞͷฒߦॲཧதͷίϧʔνϯʹεϨουΛৡΔɻ εϨου" ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ZJFME

Slide 23

Slide 23 text

εϨου" ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ZJFME

Slide 24

Slide 24 text

εϨου" ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ZJFME ZJFME ZJFME

Slide 25

Slide 25 text

Suspend Function Ͱ ίϧʔνϯͷதஅͰ͖Δੑ࣭Λ ࣮ݱ͍ͯ͠Δ

Slide 26

Slide 26 text

Kotlin CoroutineͷΩϞᶄ
 Structured Concurrency

Slide 27

Slide 27 text

Structured concurrency ฒߦੑͷߏ଄Խ • ίϧʔνϯ͸਌ࢠؔ܎Λ࣋ͯΔɻ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ

Slide 28

Slide 28 text

Α͋͘ΔϚϧνεϨουͳ
 ඇಉظॲཧͷ໰୊ • Ұ෦ͷεϨουΛམͱͨ͠(མͪͨ)ͱ͖ʹɺ
 ࢒ΓͷεϨουΛڠௐͤ͞Δͷ͕େมɻ • λΠϛϯά໰୊ͰσουϩοΫͨ͠Γɺҙਤ͠ͳ ͍ڍಈ͕ى͜Γ΍͍͢ɻ • ໰୊͕ى͖ͨͱ͖ʹݪҼڀ໌ɾσόοά͕೉͠ ͍ɻ

Slide 29

Slide 29 text

਌ࢠؔ܎ͷ͋Δίϧʔνϯ͸
 ڠௐͤ͞΍͍͢

Slide 30

Slide 30 text

਌ࢠؔ܎ͷ͋Δίϧʔνϯ͸
 ڠௐͤ͞΍͍͢ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ΞΫςΟϒͳ ίϧʔνϯ

Slide 31

Slide 31 text

਌͸ࢠڙͷऴྃΛ଴ͬͯऴྃ͢Δ ΞΫςΟϒͳ ίϧʔνϯ ଴ػதͷ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ

Slide 32

Slide 32 text

਌ࢠؔ܎ͷ͋Δίϧʔνϯ͸
 ྫ֎ɾΩϟϯηϧ࣌΋ڠௐͤ͞΍͍͢

Slide 33

Slide 33 text

਌ࢠؔ܎ͷ͋Δίϧʔνϯ͸
 ྫ֎ɾΩϟϯηϧ࣌΋ڠௐͤ͞΍͍͢ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ྫ֎ൃੜʂ

Slide 34

Slide 34 text

਌ίϧʔνϯʹྫ֎Λ఻೻ͯ͠
 ίϧʔνϯΛऴྃ͢Δ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ྫ֎ൃੜʂ ྫ֎εϩʔ ྫ֎εϩʔ

Slide 35

Slide 35 text

਌ίϧʔνϯ͕ऴྃ͢Δ࣌͸ɺ
 ࢠίϧʔνϯ΋Ωϟϯηϧ͢Δ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ ྫ֎ൃੜʂ KPCDBODFM KPCDBODFM

Slide 36

Slide 36 text

ʹ਌ίϧʔνϯΛࢭΊΕ͹ɺ ࢠίϧʔνϯ΋ࢭ·Δ

Slide 37

Slide 37 text

਌ࢠϧʔνϯͷείʔϓΛ Ωϟϯηϧ͢Ε͹ɺ ਌ࢠͱ΋Ͳ΋ࢭΊΒΕΔ

Slide 38

Slide 38 text

ίϧʔνϯͷ࣮ߦείʔϓΛ
 Ωϟϯηϧ͢Δ͚ͩͰશ෦ࢭΊΒΕΔ ίϧʔνϯ .BJO4DPQF KPCDBODFM "DUJWJUZ PO%FTUSPZ TDPQFDBODFM ίϧʔνϯ KPCDBODFM

Slide 39

Slide 39 text

(࠶ܝ) Android Hello world

Slide 40

Slide 40 text

ίϧʔνϯ͸Ͳ͏΍ͬͯ ਌ࢠؔ܎Λ࡞͍ͬͯΔͷ͔ʁ → CoroutineScope

Slide 41

Slide 41 text

launch ͷϥϜμࣜ͸
 this = CoroutineScope

Slide 42

Slide 42 text

ίϧʔνϯ .BJO4DPQF KPCDBODFM "DUJWJUZ PO%FTUSPZ TDPQFDBODFM ίϧʔνϯ ίϧʔνϯ KPCDBODFM (MPCBM4DPQF GlobalScopeͷίϧʔνϯ͸.BJO4DPQFͱؔ܎ͳ͘ಈ͘ʂ launch launch launch

Slide 43

Slide 43 text

Structured Concurrency Λ ׆༻͢Ε͹ ίϧʔνϯ؅ཧָ͕ʹͳΔ

Slide 44

Slide 44 text

Kotlin CoroutineͷΩϞᶅ
 CoroutineContext

Slide 45

Slide 45 text

CoroutineContext %JTQBUDIFSɿ.BJO +PCɿͳ͠ ϝΠϯείʔϓͷίϯςΩετ %JTQBUDIFSɿ.BJO +PCɿίϧʔνϯ είʔϓ1ͷίϯςΩετ %JTQBUDIFSɿ.BJO +PCɿίϧʔνϯ είʔϓͷίϯςΩετ %JTQBUDIFSɿ%FGBVMU +PCɿίϧʔνϯ είʔϓͷίϯςΩετ ϝΠϯείʔϓ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ1ͷείʔϓ είʔϓ ίϧʔνϯͷείʔϓ είʔϓ ίϧʔνϯ ίϧʔνϯͷείʔϓ είʔϓ

Slide 46

Slide 46 text

CoroutineContextͷྫ: Job
 ͋Δίϧʔνϯͷ࣮ߦΛද͢Πϯελϯε • ίϧʔνϯΛ࣮ߦ͢ΔͱJobΛ͔͑͢ɻ

Slide 47

Slide 47 text

CoroutineContext %JTQBUDIFSɿ.BJO +PCɿͳ͠ ϝΠϯείʔϓͷίϯςΩετ %JTQBUDIFSɿ.BJO +PCɿίϧʔνϯ είʔϓ1ͷίϯςΩετ %JTQBUDIFSɿ.BJO +PCɿίϧʔνϯ είʔϓͷίϯςΩετ %JTQBUDIFSɿ%FGBVMU +PCɿίϧʔνϯ είʔϓͷίϯςΩετ ϝΠϯείʔϓ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ1ͷείʔϓ είʔϓ ίϧʔνϯͷείʔϓ είʔϓ ίϧʔνϯ ίϧʔνϯͷείʔϓ είʔϓ

Slide 48

Slide 48 text

CoroutineContextͷྫ: CorouttineDispatcher
 ίϧʔνϯΛͲͷεϨουͰಈ͔͔͢ΛܾΊΔਓ • Dispatches.Main • Dispatchers.Default • Dispatchers.IO • Dispatchers.Unconfined • ͦͷଞ: newSingleThreadContext("threadName") ͳͲ

Slide 49

Slide 49 text

CoroutineContext %JTQBUDIFSɿ.BJO +PCɿͳ͠ ϝΠϯείʔϓͷίϯςΩετ %JTQBUDIFSɿ.BJO +PCɿίϧʔνϯ είʔϓ1ͷίϯςΩετ %JTQBUDIFSɿ.BJO +PCɿίϧʔνϯ είʔϓͷίϯςΩετ %JTQBUDIFSɿ%FGBVMU +PCɿίϧʔνϯ είʔϓͷίϯςΩετ ϝΠϯείʔϓ ίϧʔνϯ ίϧʔνϯ ίϧʔνϯ1ͷείʔϓ είʔϓ ίϧʔνϯͷείʔϓ είʔϓ ίϧʔνϯ ίϧʔνϯͷείʔϓ είʔϓ

Slide 50

Slide 50 text

CoroutinenContextͷྫ:ͦͷଞ • CoroutineName("name") • NonCancellable • CoroutineExceptionHandler {}

Slide 51

Slide 51 text

CoroutineContextͷ࢖͍ํ • ίϧʔνϯϏϧμʔͷҾ਺ʹࢦఆͯ͠࢖͏ • + Ͱ࿈݁ʢॏෳͨ͠ઃఆ͸ӈล༏ઌʣͯ͠૊Έ߹ Θͤͯ࡞Δ

Slide 52

Slide 52 text

CoroutineContextͷ࢖͍ํ • ಉظతʹৼΔ෣ͬͯ͘ΕΔ withContext ͕ศར

Slide 53

Slide 53 text

Kotlin CoroutineͷΩϞᶅ
 Async as Sync

Slide 54

Slide 54 text

TwitterΫϥΠΞϯτతͳ ΞϓϦ࣮૷ΛίϧʔνϯͰߟ͑Δɻ ϩάΠϯ 0, λΠϜϥΠϯऔಘ < l͓͸Α͏z lࠓ೔͸ษڧձͰ͢z >

Slide 55

Slide 55 text

ίϧʔνϯ͸ඇಉظ • ྫ: ϩάΠϯͯ͠λΠϜϥΠϯऔಘ͢ΔAPI࣮૷

Slide 56

Slide 56 text

ίϧʔνϯ͸ඇಉظʁ • ඇಉظॲཧΛಉظతͳײ֮Ͱखଓ͖తʹॻ͚Δ

Slide 57

Slide 57 text

ίϧʔνϯ͸ඇಉظॲཧΛಉظ తʢखଓ͖తʣʹॻ͚Δ • ಉظతʹॻ͚ΔͷͰɺ௚ײతͰɺόάΛຒΊࠐΈ ʹ͍͘ɻ(σουϩοΫɾ࣮ߦλΠϛϯά໰୊) • ͳΜͱ͔Listener΍ίʔϧόοΫ஍ࠈ͔Βͷղ์ɻ

Slide 58

Slide 58 text

async / await ΋͋Δ • async ίϧʔνϯͰɺඇಉظίϧʔνϯʹͭͭ͠ɺ ݁ՌΛ଴ͭ͜ͱ΋Ͱ͖Δ • async = ݁ՌΛड͚औΕΔػೳΛ΋ͭ launchɻ

Slide 59

Slide 59 text

Kotlin ίϧʔνϯͷ جຊ͸͜Ε͚ͩ

Slide 60

Slide 60 text

Kotlin Coroutineͷ ศརͳػೳͷ঺հ

Slide 61

Slide 61 text

flow ίϧʔνϯ • flow = γʔέϯεͰॱ࣍݁ՌΛྲྀ͢ async. • Rx ObservableΛࢀߟʹ࡞ΒΕ͍ͯΔɻ • map(transform{}), flatMap,ϑΟϧλ,
 ྫ֎෮ؼॲཧ(catch{}), εϨου੾Γସ͑, combineLatest, zip ͳͲ΋͋Δɻ

Slide 62

Slide 62 text

Channels, produce, actor • Channel ͸ίϧʔνϯؒͷ૒ํ޲ͷσʔ λ΍ΓऔΓʹ͔ͭ͑ΔΦϒδΣΫτɻ • produce { } ... ࢠ͕ૹ৴ͯ͠਌͕ड৴͢Δ Ұํ޲νϟϯωϧΛ࡞Δίϧʔνϯɻ • actor { } ... ਌͕ૹ৴ͯ͠ࢠ͕ड৴͢ΔҰํ ޲νϟωϧΛ࡞Δίϧʔνϯɻ

Slide 63

Slide 63 text

AndroidXͰ࢖͑Δศརͳػೳ • ViewModelScope • LifecycleScope • liveData { LiveDataScope -> Unit ... }: LiveData