Slide 1

Slide 1 text

"OESPJEͷඇಉظॲཧΛ ɹɹɹɹɹίϧʔνϯͰߦ͏ 3Y+B/JHIU 5PTIJIJSP:BHJ

Slide 2

Slide 2 text

ࣗݾ঺հ w ീ໦ढ़޿ !TZTZBHJ w "OESPJEΤϯδχΞ ٕज़෦௕

Slide 3

Slide 3 text

3Y+B/JHIUͳͷʹ ίϧʔνϯʁ

Slide 4

Slide 4 text

3Y+BWBͷ༻్ w -JTUॲཧͷந৅ԽɾετϦʔϜԽ w 0QUJPOBM w 1SPNJTF w %BUB#JOEJOH w &WFOU#VT

Slide 5

Slide 5 text

3Y+BWBͷ༻్ w -JTUॲཧͷந৅ԽɾετϦʔϜԽ w 0QUJPOBM w 1SPNJTF w %BUB#JOEJOH w &WFOU#VT

Slide 6

Slide 6 text

1SPNJTFͱͯ͠ͷ3Y+BWBΛ ίϧʔνϯ BTZODBXBJU Ͱஔ͖׵͑ΒΕΔͷͰ͸ʁ

Slide 7

Slide 7 text

ΞδΣϯμ w ίϧʔνϯͱ͸ͳʹ͔ w ,PUMJOʹ͓͚Δίϧʔνϯ w ࠓճऔΓѻ͏ඇಉظॲཧͷൣғ w 3Y+BWBͰͷ࣮૷ w ίϧʔνϯͰͷ࣮૷ w ײ૝

Slide 8

Slide 8 text

ίϧʔνϯͱ͸ͳʹ͔

Slide 9

Slide 9 text

ίϧʔνϯͱ͸ͳʹ͔ w ίϧʔνϯʢӳDPSPVUJOFʣͱ͸ϓϩάϥϛ ϯάͷߏ଄ͷҰछɻαϒϧʔνϯ͕ΤϯτϦʔ͔ ΒϦλʔϯ·ͰΛҰͭͷॲཧ୯Ґͱ͢Δͷʹର͠ɺ ίϧʔνϯ͸͍ͬͨΜॲཧΛதஅͨ͠ޙɺଓ͖͔ ΒॲཧΛ࠶։Ͱ͖Δ w αϒϧʔνϯͱҟͳΓɺঢ়ଶ؅ཧΛҙࣝͤͣʹߦ ͑ΔͨΊɺڠௐతॲཧɺΠςϨʔλɺແݶϦετɺ ύΠϓͳͲɺܧଓঢ়گΛ࣋ͭϓϩάϥϜ͕༰қʹ هड़Ͱ͖Δɻ WJB8JLJQFEJBIUUQTKBXJLJQFEJBPSHXJLJ&#&"#&#$&&#

Slide 10

Slide 10 text

ؔ਺ͷ్தͰதஅͨ͠Γ ࠶։ͨ͠ΓͰ͖Δ΍ͭ

Slide 11

Slide 11 text

,PUMJOʹ͓͚Δίϧʔνϯ

Slide 12

Slide 12 text

,PUMJO͔Βಋೖ w ʹϦϦʔε w ݴޠ࢓༷ʹʮίϧʔνϯΛ࣮૷͢ΔͨΊ ͷػೳʯΛ௥Ճ ࢓༷Λٞ࿦͢ΔϦϙδτϦ IUUQTHJUIVCDPN,PUMJOLPUMJODPSPVUJOFTCMPCNBTUFSLPUMJODPSPVUJOFTJOGPSNBMNE

Slide 13

Slide 13 text

࣮ࡍͷػೳ͸ϥΠϒϥϦͱͯ͠ఏڙ w DPSF SFBDUJWF VJ JOUFHSBUJPOͳ ͲͷϞδϡʔϧʹ෼͔Ε͍ͯΔ ίϧʔνϯϥΠϒϥϦͷϦϙδτϦ IUUQTHJUIVCDPN,PUMJOLPUMJOYDPSPVUJOFT

Slide 14

Slide 14 text

"OESPJE޲͚ʹ΋ଗ͍ͬͯΔ w DPSFͱVJBOESPJEϞδϡʔϧΛ࢖͑͹ େମ͍͚Δ "OESPJEϞδϡʔϧͷ༷ࢠ IUUQTHJUIVCDPN,PUMJOLPUMJOYDPSPVUJOFTUSFFNBTUFSVJLPUMJOYDPSPVUJOFTBOESPJE

Slide 15

Slide 15 text

ͨͩ͠·ͩFYQFSJNFOUBM w LPUMJOYDPSPVUJOFTFYQFSJNFOUBM ύοέʔδʹؔ࿈͢ΔΫϥε͕͋Δ w ຊ൪౤ೖ͸ͦΕͳΓʹ֮ޛ͕ඞཁ

Slide 16

Slide 16 text

ࠓճऔΓѻ͏ඇಉظॲཧͷൣғ

Slide 17

Slide 17 text

ࠓճऔΓѻ͏ඇಉظॲཧͷൣғ w ୯ൃͷ࣮ߦ w ௚ྻͷ࣮ߦ w ฒྻͷ࣮ߦ w ΤϥʔϋϯυϦϯά w Ωϟϯηϧ ʴ

Slide 18

Slide 18 text

3Y+BWBͰͷ࣮૷

Slide 19

Slide 19 text

؀ڥ w 3Y"OESPJE w 3Y,PUMJO

Slide 20

Slide 20 text

୯ൃͷ࣮ߦ val disposable = shopApi.getShop(10) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( { // success }, { // error } ) εέδϡʔϥΛ͍͍ײ͡ʹઃఆ

Slide 21

Slide 21 text

௚ྻͷ࣮ߦ val disposable = userApi.me() .flatMap { user -> subscriptionShopApi.getSubscriptionShops(user.id) } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( { // success }, { // error } ) qBU.BQΛ࢖ͬͯ௚ྻʹ࣮ߦ͢Δ

Slide 22

Slide 22 text

ฒྻͷ࣮ߦ val disposable = Single.zip>( userApi.me().subscribeOn(Schedulers.io()), shopApi.getShop(10L).subscribeOn(Schedulers.io()), BiFunction { user, shop -> Pair(user, shop) } ) .observeOn(AndroidSchedulers.mainThread()) .subscribe( { (user, shop) -> // success }, { // error } ) [JQΛ࢖ͬͯฒྻʹ࣮ߦ͢Δ

Slide 23

Slide 23 text

Ωϟϯηϧ val disposable = shopApi.getShop(10) .subscribe(/*ུ*/) disposable.dispose()

Slide 24

Slide 24 text

ίϧʔνϯͰͷ࣮૷

Slide 25

Slide 25 text

؀ڥ w ,PUMJO w LPUMJOYDPSPVUJOFTDPSF w LPUMJOYDPSPVUJOFTBOESPJE

Slide 26

Slide 26 text

୯ൃͷ࣮ߦ val job = launch(UI) { try { val shop = async(CommonPool) { shopApi.getShop(10) }.await() // success! } catch (e: Exception) { // error } }

Slide 27

Slide 27 text

୯ൃͷ࣮ߦ val job = launch(UI) { try { val shop = async(CommonPool) { shopApi.getShop(10) }.await() // success! } catch (e: Exception) { // error } } Ϗϧμʔؔ਺ͱΑ͹ΕΔɺ ίϧʔνϯΛߏங͢Δؔ਺

Slide 28

Slide 28 text

MBVODIؔ਺ w $PSPVUJOF$POUFYUʹ࣮ߦ؀ڥΛࢦఆ͢Δ w $PSPVUJOF4UBSU͸࣮ߦ։࢝ͷλΠϛϯάΛࢦఆ͢Δ w ୈࡾҾ਺ʹ࣮ߦ͢ΔϒϩοΫΛ౉͢ w ࣮ߦঢ়ଶΛද͢+PCΛฦ͢ IUUQTLPUMJOHJUIVCJPLPUMJOYDPSPVUJOFTLPUMJOYDPSPVUJOFTDPSFLPUMJOYDPSPVUJOFTFYQFSJNFOUBMMBVODIIUNM fun launch( context: CoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit ): Job

Slide 29

Slide 29 text

MBVODIؔ਺ val job = launch(UI) { //…

Slide 30

Slide 30 text

MBVODIؔ਺ val job = launch(UI) { //… LPUMJOYDPSPVUJOFTBOESPJE͕ఏڙ͢Δ$PSPVUJOF$POUFYUɻ ౉ͨ͠ϒϩοΫ಺ͷ͢΂ͯͷ࠶։ॲཧΛ6*εϨουͰߦ͏ɻ

Slide 31

Slide 31 text

BTZODؔ਺ w ୈࡾҾ਺Ͱ࣮ߦ͢ΔϒϩοΫ͕໭Γ஋Λ࣋ͭ w ࣮ߦঢ়ଶͱ࣮ߦ݁ՌΛ࣋ͭ%FGFSSFE5Λฦ͢ IUUQTLPUMJOHJUIVCJPLPUMJOYDPSPVUJOFTLPUMJOYDPSPVUJOFTDPSFLPUMJOYDPSPVUJOFTFYQFSJNFOUBMBTZODIUNM fun async( context: CoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> T ): Deferred

Slide 32

Slide 32 text

BTZODؔ਺ val job = launch(UI) { try { val shop = async(CommonPool) { shopApi.getShop(10) }.await() //…

Slide 33

Slide 33 text

BTZODؔ਺ val job = launch(UI) { try { val shop = async(CommonPool) { shopApi.getShop(10) }.await() //… LPUMJOYDPSPVUJOFTDPSF͕ఏڙ͢Δ$PSPVUJOF$POUFYUɻ KBWBVUJMDPODVSSFOU'PSL+PJO1PPMDPNNPO1PPM Λ ࢖ͬͯεϨουϓʔϧΛ࡞Γɺ࠶։ॲཧΛεϨουͰ࣮ߦ͢Δɻ "OESPJE؀ڥ /FYVT9 Ͱ͸ϓʔϧαΠζ͸ͩͬͨɻ

Slide 34

Slide 34 text

୯ൃͷ࣮ߦ val job = launch(UI) { try { val shop = async(CommonPool) { shopApi.getShop(10) }.await() // success! } catch (e: Exception) { // error } }

Slide 35

Slide 35 text

୯ൃͷ࣮ߦ val job = launch(UI) { try { val shop = async(CommonPool) { shopApi.getShop(10) }.await() // success! } catch (e: Exception) { // error } } 6*εϨουͰ଴ͪ߹Θ͍͍ͤͯͷ͔ͳʜ

Slide 36

Slide 36 text

୯ൃͷ࣮ߦ val job = launch(UI) { try { val shop = async(CommonPool) { shopApi.getShop(10) }.await() // success! } catch (e: Exception) { // error } } %FGFSSFEBXBJU ͸தஅؔ਺

Slide 37

Slide 37 text

தஅؔ਺ͱεςʔτϚγϯ w ίϯύΠϥ͕தஅؔ਺ͷݺͼग़͠Λঢ়ଶͱͯ͠෼ ղ͠ɺॲཧશମΛεςʔτϚγϯʹม׵͢Δɻ͜ ΕʹΑΓɺؔ਺ͷதஅͱ࠶։Λ࣮ݱ͍ͯ͠Δ launch(UI) { try { val shop = async(CommonPool) {…}.await() // success! } catch (e: Exception) { // error } } ঢ়ଶ async(CommonPool){…}.await() ঢ়ଶ val shop =… success ঢ়ଶ error

Slide 38

Slide 38 text

୯ൃͷ࣮ߦ val job = launch(UI) { try { val shop = async(CommonPool) { shopApi.getShop(10) }.await() // success! } catch (e: Exception) { // error } }

Slide 39

Slide 39 text

୯ൃͷ࣮ߦ val job = launch(UI) { try { val shop = async(CommonPool) { shopApi.getShop(10) }.await() // success! } catch (e: Exception) { // error } } ͪΐͬͱ৑௕ͩͳʜ

Slide 40

Slide 40 text

ิॿతͳؔ਺Λ༻ҙ͢Δ // async(CommonPool)Λ؆ུԽ͢Δ fun async(context: CoroutineContext = CommonPool, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> T) = kotlinx.coroutines.experimental.async(context, start, block) // launch(UI)Λ؆ུԽ͢Δ fun ui(start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit) = launch(UI, start, block)

Slide 41

Slide 41 text

୯ൃͷ࣮ߦ val job = ui { try { val shop = async { shopApi.getShop(10) }.await() // success } catch (e: Exception) { // error } }

Slide 42

Slide 42 text

௚ྻͷ࣮ߦ val job = ui { try { val userJob = async { userApi.me() } val subscriptionShopsJob = async { subscriptionShopApi.getSubscriptionShops(userJob.await().id) } val subscriptionShops = subscriptionShopsJob.await() // success } catch (e: Exception) { // error } }

Slide 43

Slide 43 text

௚ྻͷ࣮ߦ val job = ui { try { val userJob = async { userApi.me() } val subscriptionShopsJob = async { subscriptionShopApi.getSubscriptionShops(userJob.await().id) } val subscriptionShops = subscriptionShopsJob.await() // success } catch (e: Exception) { // error } } VTFS+PCͷ݁ՌΛ଴ͪ߹Θͤͨ͋ͱ࣮ߦ

Slide 44

Slide 44 text

ฒྻͷ࣮ߦ val job = ui { try { val userJob = async { userApi.me() } val shopJob = async { shopApi.getShop(10L) } val user = userJob.await() val shop = shopJob.await() // success catch (e: Exception) { // error } }

Slide 45

Slide 45 text

ฒྻͷ࣮ߦ val job = ui { try { val userJob = async { userApi.me() } val shopJob = async { shopApi.getShop(10L) } val user = userJob.await() val shop = shopJob.await() // success catch (e: Exception) { // error } } $PSPVUJOF4UBSU%&'"6-5Λ࢖͍ͬͯΔͷͰ ͦΕͧΕ$PNNPO1PPMͰ௚ͪʹ࣮ߦ͞ΕΔ

Slide 46

Slide 46 text

Ωϟϯηϧ val job = launch(UI) { try { val shop = async(CommonPool) { shopApi.getShop(10) }.await() // success! } catch(e: CancellationException) { // cancel } catch (e: Exception) { // error } } job.cancel()

Slide 47

Slide 47 text

Ωϟϯηϧ val job = launch(UI) { try { val shop = async(CommonPool) { shopApi.getShop(10) }.await() // success! } catch(e: CancellationException) { // cancel } catch (e: Exception) { // error } } job.cancel() ྫ֎ͱͯ͠ॲཧ

Slide 48

Slide 48 text

ײ૝

Slide 49

Slide 49 text

ײ૝ w େମ͍͚Δ ஔ͖׵͑ͯ΋Αͦ͞͏ w ௚ྻɺฒྻͷ࢖͍෼͚͕؆୯ w εϨουͷ؅ཧ͕͍ۙ৔ॴʹ͋Δ w ΤϥʔɺΩϟϯηϧ͕શͯྫ֎ͳͷͰϋϯυϦϯ ά͠΍͍͢ w ίϧʔνϯ΋3Y+BWBͱಉ͘͡Β͍Ԟ͕ਂ͍ͷͰ ͦ͜·Ͱؾܰʹ΍ΔͬͯΘ͚ʹ͸͍͔ͳ͍͚Ͳศ རͰ࠷ߴ

Slide 50

Slide 50 text

ࢀߟࢿྉ w ࠓճͷίʔυ w IUUQTHJUIVCDPNTZTZBHJJNQMFNFOUBUJPOPGBTZODSFRVFTU XJUISYKBWBPSDPSPVUJOF w $PSPVUJOFTGPS,PUMJO 3FWJTJPO w IUUQTHJUIVCDPN,PUMJOLPUMJODPSPVUJOFTCMPCNBTUFSLPUMJO DPSPVUJOFTJOGPSNBMNE w (VJEFUPLPUMJOYDPSPVUJOFTCZFYBNQMF w IUUQTHJUIVCDPN,PUMJOLPUMJOYDPSPVUJOFTCMPCNBTUFS DPSPVUJOFTHVJEFNE w (VJEFUP6*QSPHSBNNJOHXJUIDPSPVUJOFT w IUUQTHJUIVCDPN,PUMJOLPUMJOYDPSPVUJOFTCMPCNBTUFSVJ DPSPVUJOFTHVJEFVJNE

Slide 51

Slide 51 text

THANK YOU