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

Kotlin CoroutineのFlowを使った双方向通信について

Kotlin CoroutineのFlowを使った双方向通信について

Sendai.go × GDG Cloud Sendai × sendai.kt 合同忘年会!! にて発表

3c7020b33ae8880dd9514b6469a28ae0?s=128

Yuta Tomiyama

December 20, 2019
Tweet

Transcript

  1. Kotlin CoroutineのFlowを 使った双方向通信について

  2. 自己紹介 HN: マヤミト 本名: 富山 雄太 会津大学 学部2年 好きな言語: Kotlin

    GitHub: https://github.com/yt8492 Zliという会津大学の技術系LTサークルやってます Facebookのすがた Twitterのすがた ID:yt8492
  3. Kotlin好きな人

  4. Coroutine使ったことがある人

  5. Flow使ったことがある人

  6. Coroutineとは Kotlinで非同期処理を扱う中断可能な計算インスタンス JavaのThreadよりも軽量 コールバック関数をCoroutineの中断関数にラップすることが可能 fun main() = runBlocking { println(1)

    val job = launch { println(2) println(3) } println(4) job.join() } // 1-> 4 -> 2 -> 3 の順で出力
  7. Flowとは A cold asynchronous data stream that sequentially emits values

    and completes normally or with an exception. (公式ドキュメントより) Kotlin Coroutines 1.2.0-alpha-2で追加された、コールドストリームを扱う仕組み 1.3.2でstableに(一部Experimental) @sys1yagi さんの 5分でわかるKotlin Coroutines Flow がわかりやすいです https://speakerdeck.com/sys1yagi/5fen-tewakarukotlin-coroutines-flow
  8. ちょっとしたサンプルコード flowOf(1, 2, 3, 4, 5) .filter { it %

    2 == 1 } .map { it * 10 } .onEach { delay(2000) Toast.makeText(this, "value: $it", Toast.LENGTH_SHORT).show() } .launchIn(lifecycleScope)
  9. ちょっとしたサンプルコード lifecycleScope.launch { flowOf(1, 2, 3, 4, 5) .filter {

    it % 2 == 1 } .map { it * 10 } .collect { delay(2000) Toast.makeText(this@MainActivity, "value: $it", Toast.LENGTH_SHORT).show() } }
  10. 双方向通信をFlowを使って表現してみる interface ChatService { fun flowChatMessage(request: Flow<ChatMessage>): Flow<ChatMessage> } Flowは非同期のデータの流れ

    データの流れを渡し、データの流れを受け取る = 双方向通信を表現できる!
  11. gRPCを使って実装する場合

  12. gRPCを使って実装する場合

  13. WebSocketを使って実装する場合

  14. UI側 FlowとLiveDataは相互に変換可能 - Flow#asLiveData - LiveData#asFlow

  15. ソースコードとデモ (時間があったら)

  16. まとめ - Flowの登場により、非同期のデータの流れを型として表現しやすくなった - コールバックパターンで実装していたものをFlowでラップすると使いやすくなるかも - Androidの場合はLiveDataとの相互変換が便利

  17. ご静聴ありがとうございました!