Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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