Slide 1

Slide 1 text

Behavior of nested async in Kotlin Coroutines

Slide 2

Slide 2 text

About me Androidアプリ開発@DeNA 趣味は、ストリートダンス 今年、長男が爆誕 2 URI 本戸 裕理 (ホンド ユウリ)

Slide 3

Slide 3 text

Introduction 今更ですが! Kotlin 1.3より、Coroutineの安定版が 利用できるようになりました 3

Slide 4

Slide 4 text

Introduction 私が携わるプロジェクトでもCoroutineの アップデートが 行われました 4

Slide 5

Slide 5 text

Introduction 結果、 アップデート起因のバグを埋め込み、 修正をする事になりました 5

Slide 6

Slide 6 text

Introduction そう、 あるあるです 6

Slide 7

Slide 7 text

Introduction (流出はしていません)  一応、最近センシティブだからね   7

Slide 8

Slide 8 text

Introduction 今日は、バグ対応から学んだ ○ ネストしたasyncの振舞いと対応方法 について簡単にお話させて頂きます 8

Slide 9

Slide 9 text

ネストしたasyncの振舞いと対応方法 9

Slide 10

Slide 10 text

ver. 0.30.0より、ネストしたasyncのキャンセルが、 親のcoroutineにも伝播するようになったため、 今までエラーハンドリングを意識していなかった 箇所で例外が発生した 該当のFeature Overview for Bug 10

Slide 11

Slide 11 text

例えば、 以下のようなケースで例外が発生するようになった Example 11

Slide 12

Slide 12 text

例外が親のlaunchにも伝播する Example 12 Exception

Slide 13

Slide 13 text

Solution 1 withContextを利用 13

Slide 14

Slide 14 text

Solution 2 スコープを切り替える 14

Slide 15

Slide 15 text

今回の例であれば、launchにCoroutineExceptionHandler を渡して ネストされたのCoroutineのエラーをまとめてしまう Solution 3 例外の集約 15

Slide 16

Slide 16 text

※以下は、supervisorScopeの例 Solution 4 Supervisionを導入 16

Slide 17

Slide 17 text

まとめ 17 これからネスト状態でasyncを扱うときは... 1. withContextを使う 2. Suspend関数に切り出す 3. 例外の集約 4. Supervisionの導入 辺りを検討できると良いかも...そして...

Slide 18

Slide 18 text

まとめ 18 Release Note は、しっかり読みましょう!!! (自戒)

Slide 19

Slide 19 text

Reference 今回の発表の不明点は、以下でほぼ解消されます 19 ○ Kotlin Coroutines 0.30.2のExceptionが伝わる仕組み ○ Kotlin Coroutine 1.0.0までに夏から変わったところ

Slide 20

Slide 20 text

THANKS! You can find me at: Twitter : URI - @yuyuyuyuyuri Pokemon GO : 05URI28 - 0188 7196 1789 20