Upgrade to Pro — share decks privately, control downloads, hide ads and more …

完全に理解した気になる Kotlin Coroutines

完全に理解した気になる Kotlin Coroutines

takahirom

July 03, 2018
Tweet

More Decks by takahirom

Other Decks in Programming

Transcript

  1. 㸣Ⰻח椚鍑׃׋孡חז׷
    ,PUMJO$PSPVUJOFT
    UBLBIJSPN

    View Slide

  2. ˖ UBLBIJSPN !OFX@SVOOBCMF
    דׅկ
    ˖ 劤せכ嬁「䃨峔 ׭׿ׄױ׋ַמ׹
    דׅկ
    ˖ "OESPJEָ㥨ֹדׅ
    ˖ "CFNB57ך"OESPJE،فٔ׾⡲׏גְתׅկ
    ˖ 2JJUBח׮剅ְ׋ךדծ׉׸׾鋅זָ׵耀ְג
    ֻ׌ְׁկ
    ˖ IUUQTRJJUBDPNUBLBIJSPNJUFNT
    CBBEDDGCB
    荈ⴓחאְג

    View Slide

  3. $PSPVUJOFTך
    椚鍑ָꨇ׃ְ

    View Slide

  4. ⢪׻׸׷$PSPVUJOFTך"1*

    View Slide

  5. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI

    View Slide

  6. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD

    View Slide

  7. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU

    View Slide

  8. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU

    View Slide

  9. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU

    View Slide

  10. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM

    View Slide

  11. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO

    View Slide

  12. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO
    ˖ TVTQFOE$PSPVUJOF

    View Slide

  13. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO
    ˖ TVTQFOE$PSPVUJOF
    ˖ $PSPVUJOF%JTQBUDIFS

    View Slide

  14. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO
    ˖ TVTQFOE$PSPVUJOF
    ˖ $PSPVUJOF%JTQBUDIFS
    ˖ %FGFSSFE

    View Slide

  15. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO
    ˖ TVTQFOE$PSPVUJOF
    ˖ $PSPVUJOF%JTQBUDIFS
    ˖ %FGFSSFE
    ˖ 6ODPOOFE

    View Slide

  16. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO
    ˖ TVTQFOE$PSPVUJOF
    ˖ $PSPVUJOF%JTQBUDIFS
    ˖ %FGFSSFE
    ˖ 6ODPOOFE
    ˖ BOESPJE6*

    View Slide

  17. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO
    ˖ TVTQFOE$PSPVUJOF
    ˖ $PSPVUJOF%JTQBUDIFS
    ˖ %FGFSSFE
    ˖ 6ODPOOFE
    ˖ BOESPJE6*
    ˖ %FGBVMU%JTQBUDIFS

    View Slide

  18. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO
    ˖ TVTQFOE$PSPVUJOF
    ˖ $PSPVUJOF%JTQBUDIFS
    ˖ %FGFSSFE
    ˖ 6ODPOOFE
    ˖ BOESPJE6*
    ˖ %FGBVMU%JTQBUDIFS
    ˖ 3FOEF[WPVT$IBOOFM

    View Slide

  19. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO
    ˖ TVTQFOE$PSPVUJOF
    ˖ $PSPVUJOF%JTQBUDIFS
    ˖ %FGFSSFE
    ˖ 6ODPOOFE
    ˖ BOESPJE6*
    ˖ %FGBVMU%JTQBUDIFS
    ˖ 3FOEF[WPVT$IBOOFM
    ˖ 4FOE$IBOOFM

    View Slide

  20. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO
    ˖ TVTQFOE$PSPVUJOF
    ˖ $PSPVUJOF%JTQBUDIFS
    ˖ %FGFSSFE
    ˖ 6ODPOOFE
    ˖ BOESPJE6*
    ˖ %FGBVMU%JTQBUDIFS
    ˖ 3FOEF[WPVT$IBOOFM
    ˖ 4FOE$IBOOFM
    ˖ 3FDFJWF$IBOOFM

    View Slide

  21. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO
    ˖ TVTQFOE$PSPVUJOF
    ˖ $PSPVUJOF%JTQBUDIFS
    ˖ %FGFSSFE
    ˖ 6ODPOOFE
    ˖ BOESPJE6*
    ˖ %FGBVMU%JTQBUDIFS
    ˖ 3FOEF[WPVT$IBOOFM
    ˖ 4FOE$IBOOFM
    ˖ 3FDFJWF$IBOOFM
    ˖ BDUPS

    View Slide

  22. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO
    ˖ TVTQFOE$PSPVUJOF
    ˖ $PSPVUJOF%JTQBUDIFS
    ˖ %FGFSSFE
    ˖ 6ODPOOFE
    ˖ BOESPJE6*
    ˖ %FGBVMU%JTQBUDIFS
    ˖ 3FOEF[WPVT$IBOOFM
    ˖ 4FOE$IBOOFM
    ˖ 3FDFJWF$IBOOFM
    ˖ BDUPS
    ˖ SVO#MPDLJOH

    View Slide

  23. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO
    ˖ TVTQFOE$PSPVUJOF
    ˖ $PSPVUJOF%JTQBUDIFS
    ˖ %FGFSSFE
    ˖ 6ODPOOFE
    ˖ BOESPJE6*
    ˖ %FGBVMU%JTQBUDIFS
    ˖ 3FOEF[WPVT$IBOOFM
    ˖ 4FOE$IBOOFM
    ˖ 3FDFJWF$IBOOFM
    ˖ BDUPS
    ˖ SVO#MPDLJOH
    ˖ KPJO

    View Slide

  24. ⢪׻׸׷$PSPVUJOFTך"1*
    ˖ MBVODI
    ˖ BTZOD
    ˖ BXBJU
    ˖ XJUI$POUFYU
    ˖ $PSPVUJOF$POUFYU
    ˖ $PNNPO1PPM
    ˖ $POUJOVBUJPO
    ˖ TVTQFOE$PSPVUJOF
    ˖ $PSPVUJOF%JTQBUDIFS
    ˖ %FGFSSFE
    ˖ 6ODPOOFE
    ˖ BOESPJE6*
    ˖ %FGBVMU%JTQBUDIFS
    ˖ 3FOEF[WPVT$IBOOFM
    ˖ 4FOE$IBOOFM
    ˖ 3FDFJWF$IBOOFM
    ˖ BDUPS
    ˖ SVO#MPDLJOH
    ˖ KPJO
    ˖ 

    View Slide

  25. 㢳ְ

    View Slide

  26. ת׆כ㛇劤涸זהֿ׹ַ׵
    ׍ׯ׿ה椚鍑׃׋ְ

    View Slide

  27. MBVODI

    launch {
    println("thread:"+Thread.currentThread())
    }
    MBVODIדDPSPUVJOF׾饯⹛ׅ׷

    View Slide

  28. MBVODI

    launch {
    println("thread:"+Thread.currentThread())
    }
    thread:Thread[ForkJoinPool.commonPool-worker-2,5,main]
    MBVODIדDPSPUVJOF׾饯⹛ׅ׷

    View Slide

  29. MBVODI

    launch {
    println("thread:"+Thread.currentThread())
    }
    thread:Thread[ForkJoinPool.commonPool-worker-2,5,main]
    ֿ̓ך5ISFBEכוַֿ׵勻׋
    MBVODIדDPSPUVJOF׾饯⹛ׅ׷

    View Slide

  30. MBVODI

    launch {
    println("thread:"+Thread.currentThread())
    }
    thread:Thread[ForkJoinPool.commonPool-worker-2,5,main]
    MBVODIדDPSPUVJOF׾饯⹛ׅ׷
    MBVODIך⚥׾鋅ח遤ֲֿ

    View Slide

  31. MBVODI
    ך⚥魦
    public fun launch(
    context: CoroutineContext = DefaultDispatcher,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    parent: Job? = null,
    onCompletion: CompletionHandler? = null,
    block: suspend CoroutineScope.() -> Unit
    ): Job {
    㹋כ$PSPVUJOF$POUFYUד㹋遤ׅ׷5ISFBEָ寸ת׷

    View Slide

  32. MBVODI
    ך$PSPVUJOF$POUFYU
    public fun launch(
    context: CoroutineContext = DefaultDispatcher,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    parent: Job? = null,
    onCompletion: CompletionHandler? = null,
    block: suspend CoroutineScope.() -> Unit
    ): Job {
    䒷侧ך$PSPVUJOF$POUFYUכرؿٕؓزד%FGBVMU%JTQBUDIFS
    植朐כ%FGBVMU%JTQBUDIFSכ$PNNPO1PPM
    public val DefaultDispatcher: CoroutineDispatcher = CommonPool

    View Slide

  33. MBVODI
    ך$PSPVUJOF$POUFYU
    public fun launch(
    context: CoroutineContext = DefaultDispatcher,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    parent: Job? = null,
    onCompletion: CompletionHandler? = null,
    block: suspend CoroutineScope.() -> Unit
    ): Job {
    $PNNPO1PPM
    public val DefaultDispatcher: CoroutineDispatcher = CommonPool

    View Slide

  34. MBVODI
    ד⢪׻׸גְ׷
    $PNNPO1PPM
    object CommonPool : CoroutineDispatcher() {
    override fun dispatch(
    context: CoroutineContext,
    block: Runnable
    ) =
    try { (pool ?: getOrCreatePoolSync()).execute(timeSource.trackTask(block)) }

    $PNNPO1PPMך
    EJTQBUDIًاحسָㄎל׸׷

    View Slide

  35. MBVODI
    ד⢪׻׸גְ׷
    $PNNPO1PPM
    object CommonPool : CoroutineDispatcher() {
    override fun dispatch(
    context: CoroutineContext,
    block: Runnable
    ) =
    try { (pool ?: getOrCreatePoolSync()).execute(timeSource.trackTask(block)) }

    5ISFBE1PPMָזֽ׸ל⡲׶ծFYFDVUFׅ׷׌ֽ

    View Slide

  36. 知⽃ז

    %JTQBUDIFS׾⡲׏ג׫׷

    View Slide

  37. 鑐׃ח$PSPVUJOF%JTQBUDIFS׾

    ⡲׏ג׫׷
    class MyDispatcher : CoroutineDispatcher() {
    override fun dispatch(context: CoroutineContext,
    block: Runnable) {
    println("dispatch:before")
    block.run()
    println("dispatch:after")
    }
    }
    launch(MyDispatcher()) {
    println("thread:"+Thread.currentThread())
    }
    $PSPVUJOF%JTQBUDIFS׾竰䪫׃׋ؙٓأ׾⡲׷

    View Slide

  38. 鑐׃ח$PSPVUJOF%JTQBUDIFS׾

    ⡲׏ג׫׷
    class MyDispatcher : CoroutineDispatcher() {
    override fun dispatch(context: CoroutineContext,
    block: Runnable) {
    println("dispatch:before")
    block.run()
    println("dispatch:after")
    }
    }
    launch(MyDispatcher()) {
    println("thread:"+Thread.currentThread())
    }
    荈ⴓד⡲׏׋%JTQBUDIFS׾䭷㹀ׅ׷

    View Slide

  39. 鑐׃ח$PSPVUJOF%JTQBUDIFS׾

    ⡲׏ג׫׷
    class MyDispatcher : CoroutineDispatcher() {
    override fun dispatch(context: CoroutineContext,
    block: Runnable) {
    println("dispatch:before")
    block.run()
    println("dispatch:after")
    }
    }
    launch(MyDispatcher()) {
    println("thread:"+Thread.currentThread())
    }
    EJTQBUDIًاحس׾㹋鄲׃ג׫׷

    View Slide

  40. class MyDispatcher : CoroutineDispatcher() {
    override fun dispatch(context: CoroutineContext,
    block: Runnable) {
    println("dispatch:before")
    block.run()
    println("dispatch:after")
    }
    }
    launch(MyDispatcher()) {
    println("thread:"+Thread.currentThread())
    }
    EJTQBUDICFGPSF
    UISFBE5ISFBE
    EJTQBUDIBGUFS
    ׉ךתתךأٖحسד
    㹋遤דֹ׋

    View Slide

  41. $PSPVUJOFT׏ג5ISFBEה
    ずׄדכ

    View Slide

  42. $PSPVUJOFTחכ

    ⚥倖ָ֮׷

    View Slide

  43. ⚥倖
    class MyDispatcher : CoroutineDispatcher() {
    val executor = Executors.newSingleThreadExecutor()
    override fun dispatch(context: CoroutineContext, block: Runnable) {
    executor.execute {
    println("dispatch:before")
    block.run()
    println("dispatch:after")
    }
    }
    }
    launch(MyDispatcher()) {
    println("1:" + Thread.currentThread())
    suspendCoroutine { continuation ->
    thread {
    // ී௨ʹthreadΛ࡞࣮ͬͯߦ͢Δ
    // தஅ͞ΕͨCoroutinesΛ࠶։͢Δ
    continuation.resume("test")
    }
    }
    println("2:" + Thread.currentThread())
    }
    㹋ꥷך⹛ֹח

    さ׻ׇ׷׋׭
    ➙㔐ך⢽דכ
    FYFDVUPS׾⢪ֲ

    View Slide

  44. class MyDispatcher : CoroutineDispatcher() {
    val executor = Executors.newSingleThreadExecutor()
    override fun dispatch(context: CoroutineContext, block: Runnable) {
    executor.execute {
    println("dispatch:before")
    block.run()
    println("dispatch:after")
    }
    }
    }
    launch(MyDispatcher()) {
    println("1:" + Thread.currentThread())
    suspendCoroutine { continuation ->
    thread {
    // ී௨ʹthreadΛ࡞࣮ͬͯߦ͢Δ
    // தஅ͞ΕͨCoroutinesΛ࠶։͢Δ
    continuation.resume("test")
    }
    }
    println("2:" + Thread.currentThread())
    }
    TVTQFOE$PSPVUJOF
    ׾⢪ֲה
    DPSPVUJOFT⚥倖דֹ׷

    View Slide

  45. class MyDispatcher : CoroutineDispatcher() {
    val executor = Executors.newSingleThreadExecutor()
    override fun dispatch(context: CoroutineContext, block: Runnable) {
    executor.execute {
    println("dispatch:before")
    block.run()
    println("dispatch:after")
    }
    }
    }
    launch(MyDispatcher()) {
    println("1:" + Thread.currentThread())
    suspendCoroutine { continuation ->
    thread {
    // ී௨ʹthreadΛ࡞࣮ͬͯߦ͢Δ
    // தஅ͞ΕͨCoroutinesΛ࠶։͢Δ
    continuation.resume("test")
    }
    }
    println("2:" + Thread.currentThread())
    }
    SFTVNF
    ׾⢪ֲהⱄꟚדֹ׷

    View Slide

  46. override fun dispatch(context: CoroutineContext, block: Runnable)
    executor.execute {
    println("dispatch:before")
    block.run()
    println("dispatch:after")
    }
    }
    }
    launch(MyDispatcher()) {
    println("1:" + Thread.currentThread())
    suspendCoroutine { continuation ->
    thread {
    // ී௨ʹthreadΛ࡞࣮ͬͯߦ͢Δ
    // தஅ͞ΕͨCoroutinesΛ࠶։͢Δ
    continuation.resume("test")
    }
    }
    println("2:" + Thread.currentThread())
    }
    ⚥倖⵸ה⚥倖䖓ךⱄꟚד
    㔐5ISFBE1PPMד
    㹋遤ׁ׸גְ׷
    EJTQBUDICFGPSF
    5ISFBE
    EJTQBUDIBGUFS
    ͜͜ͰҰ౓தஅ
    EJTQBUDICFGPSF
    5ISFBE
    EJTQBUDIBGUFS

    View Slide

  47. "OESPJEד
    㹋ꥷוֲ⢪ֲ

    View Slide

  48. launch(UI) {
    val response = api.fetch()
    Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show()
    }
    "1*ַ׵《䖤׃גծ׉ךⰻ㺁׾4OBDLCBSח⳿ׅ⢽

    View Slide

  49. launch(UI) {
    val response = api.fetch()
    Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show()
    }
    "1*ַ׵《䖤׃גծ׉ךⰻ㺁׾4OBDLCBSח⳿ׅ⢽
    6*ծծ

    View Slide

  50. val UI = HandlerContext(Handler(Looper.getMainLooper()), “UI")
    public class HandlerContext(
    private val handler: Handler,
    private val name: String? = null
    ) : CoroutineDispatcher(), Delay {

    override fun dispatch(context: CoroutineContext, block: Runnable) {
    handler.post(block)
    }
    launch(UI) {
    val response = api.fetch()
    Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show()
    }
    "OESPJEך)BOEMFS׾⡲׷

    View Slide

  51. val UI = HandlerContext(Handler(Looper.getMainLooper()), “UI")
    public class HandlerContext(
    private val handler: Handler,
    private val name: String? = null
    ) : CoroutineDispatcher(), Delay {

    override fun dispatch(context: CoroutineContext, block: Runnable) {
    handler.post(block)
    }
    launch(UI) {
    val response = api.fetch()
    Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show()
    }
    "OESPJEך)BOEMFSחQPTUׅ׷׌ֽ

    View Slide

  52. launch(UI) {
    val response = api.fetch()
    Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show()
    }

    View Slide

  53. launch(UI) {
    val response = api.fetch()
    Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show()
    }
    GFUDI
    ך⚥כ

    View Slide

  54. launch(UI) {
    val response = api.fetch()
    Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show()
    }
    Api.kt
    interface ApiSearvice {
    @GET("/")
    fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"):
    Deferred
    }
    val service = retrofit.create(ApiSearvice::class.java)
    suspend fun fetch(): Response {
    return service.fetchDeferrd().await()
    }
    3FUSPUח״׷㹋鄲

    View Slide

  55. launch(UI) {
    val response = api.fetch()
    Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show()
    }
    Api.kt
    interface ApiSearvice {
    @GET("/")
    fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"):
    Deferred
    }
    val service = retrofit.create(ApiSearvice::class.java)
    suspend fun fetch(): Response {
    return service.fetchDeferrd().await()
    }
    SFUSPULPUMJODPSPVUJOFTBEBQUFS׾⢪ֲה

    %FGFSSFE׾鵤ׅ

    View Slide

  56. launch(UI) {
    val response = api.fetch()
    Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show()
    }
    Api.kt
    interface ApiSearvice {
    @GET("/")
    fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"):
    Deferred
    }
    val service = retrofit.create(ApiSearvice::class.java)
    suspend fun fetch(): Response {
    return service.fetchDeferrd().await()
    }
    %FGFSSFEכBXBJU
    ׅ׷ֿהד穠卓׾《䖤דֹ׷
    BXBJU
    ׾ㄎעֿהדDPSPVUJOFTָ⚥倖׃גծ
    0L)UUQך鸐⥋أٖحسד《䖤׃גծ
    《䖤דֹ如痥ⱄꟚׅ׷կ

    View Slide

  57. launch(UI) {
    val response = api.fetch()
    Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show()
    }
    Api.kt
    interface ApiSearvice {
    @GET("/")
    fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"):
    Deferred
    }
    val service = retrofit.create(ApiSearvice::class.java)
    suspend fun fetch(): Response {
    return service.fetchDeferrd().await()
    }
    TVTQFOEًاحس׾⢪ֲהծ
    BXBJU
    ׾剅ַ׆חず劍涸ח《䖤׃גְ׷״ֲח剅ֽ׷
    ,PUMJOךط؎ذ؍ـזأة؎ٕכֿך剅ֹ倯
    ˖ IUUQTHJUIVCDPN,PUMJOLPUMJODPSPVUJOFTCMPCNBTUFSLPUMJODPSPVUJOFTJOGPSNBMNEBTZODISPOPVTQSPHSBNNJOHTUZMFT

    View Slide

  58. launch(UI) {
    val response = api.fetch()
    Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show()
    }
    Api.kt
    interface ApiSearvice {
    @GET("/")
    fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"):
    Deferred
    }
    val service = retrofit.create(ApiSearvice::class.java)
    suspend fun fetch(): Response {
    return service.fetchDeferrd().await()
    }
    TVTQFOEًاحس׾⢪ֲ׋׭ח׻ׂ׻ׂٓحف׃גְ׷
    ˖ IUUQTHJUIVCDPN,PUMJOLPUMJODPSPVUJOFTCMPCNBTUFSLPUMJODPSPVUJOFTJOGPSNBMNEBTZODISPOPVTQSPHSBNNJOHTUZMFT

    View Slide

  59. ׌ְ׋ְ椚鍑דֹ׋

    View Slide

  60. תה׭
    ˖ $PSPVUJFOTכ5ISFBE♳ד⹛ֻծ⹛ֹכ然钠דֹ׷
    ˖ ⚥倖ָדֹגⱄꟚָדֹ׷
    ˖ TVTQFOE׾⢪׏׋剅ֹ倯ד剅ְגְֻ

    View Slide