$30 off During Our Annual Pro Sale. View Details »

kanmoba-returns-02.pdf

 kanmoba-returns-02.pdf

Takuji Nishibayashi

June 12, 2019
Tweet

More Decks by Takuji Nishibayashi

Other Decks in Technology

Transcript

  1. 5෼ͰΘ͔ͬͨؾʹͳΔKotlin
    Corou,nes
    @takuji31
    ؼ͖ͬͯͨؔ੢ϞόΠϧΞϓϦݚڀձ #2

    View Slide

  2. ࣗݾ঺հ

    View Slide

  3. ࣗݾ঺հ
    • @takuji31 id:takuji31
    • Takuji Nishibayashi
    • Hatena Co., Ltd.
    • App Team
    • ίϛοΫDAYS
    • δϟϯϓϧʔΩʔʂ
    • ΧΫϤϜ

    View Slide

  4. ࣗݾ঺հ
    • Android
    • Kotlin
    • Flu-er

    !
    h-ps:/
    /blog.takuji31.jp

    "
    h-ps:/
    /nazuna.takuji31.jp

    # $
    h-ps:/
    /photo.takuji31.jp

    View Slide

  5. Kotlin Corou+nes

    View Slide

  6. ࢖ͬͯ·͔͢ʁ

    View Slide

  7. ίϧʔνϯʢӳ: co-rou(neʣͱ͸ϓϩάϥ
    ϛϯάͷߏ଄ͷҰछɻαϒϧʔνϯ͕Τϯτ
    Ϧʔ͔ΒϦλʔϯ·ͰΛҰͭͷॲཧ୯Ґͱ͢
    Δͷʹର͠ɺίϧʔνϯ͸͍ͬͨΜॲཧΛ
    தஅͨ͠ޙɺଓ͖͔ΒॲཧΛ࠶։Ͱ͖Δɻ
    — h$ps://ja.wikipedia.org/wiki/
    %E3%82%B3%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3

    View Slide

  8. Corou%neʹ͍͓ͭͯ͞Β͍͠·
    ͠ΐ͏

    View Slide

  9. suspended func*on

    View Slide

  10. தஅՄೳͳؔ਺

    View Slide

  11. suspend function fetchUser() : User {
    val user = // ωοτϫʔΫ௨৴ͳͲͷॏ͍ॲཧ
    return user
    }

    View Slide

  12. Corou%neContext

    View Slide

  13. Corou%neͷίϯςΩετ

    View Slide

  14. ෳ਺ͷElementΛ૊Έ߹Θͤͯ࡞Δ

    View Slide

  15. Job

    View Slide

  16. Dispatcher

    View Slide

  17. Name

    View Slide

  18. Excep&onHandler

    View Slide

  19. ωετՄೳ

    View Slide

  20. val context = Job() + Dispatchers.Main
    launch(context) {
    // run in main thread
    delay(100)
    val response = withContext(Dispatchers.Default) {
    // run in background thread
    networkAccess()
    }
    }

    View Slide

  21. Corou%neScope

    View Slide

  22. Corou%neͷείʔϓ

    View Slide

  23. ContextΛ࣋ͭ

    View Slide

  24. ωετՄೳ

    View Slide

  25. async/launchͰ্ཱͪ͛ͨίϧʔν
    ϯ಺Ͱྫ֎͕ى͖Δͱείʔϓશମ
    ͕ࢮ͵ͷͰ஫ҙ

    View Slide

  26. Ϋϥογϡ͢Δ΍ͭ
    // ྫ֎Ͱείʔϓશମ͕ࢮΜͰΫϥογϡ͢Δ
    coroutineScope {
    try {
    val user = async { fetchUser() }
    val series = async { fetchSeries("12345") }
    doSomething(user.await(), series.await())
    } catch (e: IOException) {
    // catch͞Εͳ͍
    }
    }

    View Slide

  27. ରࡦ
    coroutineScope {
    try {
    // Nested scope
    val (user, series) = coroutineScope {
    val user = async { fetchUser() }
    val series = async { fetchSeries("12345") }
    Pair(user, series)
    }
    doSomething(user.await(), series.await())
    } catch (e: IOException) {
    // show error
    }
    }

    View Slide

  28. Deferred

    View Slide

  29. ϊϯϒϩοΩϯάͳFuture

    View Slide

  30. val user = async { fetchUser() } // Deferred
    val series = async { fetchSeries("12345") } // Deferred
    doSomething(user.await(), series.await())

    View Slide

  31. Channel

    View Slide

  32. ϗοτͳετϦʔϜ

    View Slide

  33. val channel = Channel(Channel.CONFLATED)
    userObserver.addOnChangeListener { user ->
    launch { channel.send(user) }
    }
    channel.consumeEach { user ->
    doSomething(user)
    }

    View Slide

  34. Flow

    View Slide

  35. ίʔϧυͳετϦʔϜ

    View Slide

  36. Preview status

    View Slide

  37. 1.3.0-M1ͰExperimentalʹ

    View Slide

  38. val userFlow = flow {
    emit(observeUser())
    }
    val seriesFlow = flow {
    emit(observeSeries())
    }
    userFlow.combineLatest(seriesFlow) { user, series ->
    createItemModels(user, series)
    }.collect { itemModels ->
    // show items
    }

    View Slide

  39. Enjoy Kotlin Corou.nes life!

    View Slide