Slide 1

Slide 1 text

Kotlin導入 5つのステップ

Slide 2

Slide 2 text

Koji Wakamiya Work : Studyplus, Inc. Github : @koji-1009 Twitter : @D_R_1009 2

Slide 3

Slide 3 text

Kotlin std libを考える 環境から確認する 1

Slide 4

Slide 4 text

minSDK を見る 環境に合わせた適切なstdを選ぶ! ※minSDK21以上ならほとんど影響なし 4

Slide 5

Slide 5 text

SDK16 + Kotlin? ● API16ならstdライブラリを利用すべき ○ Android4系のテストは厳しい ○ SDKはminSDKが利用アプリに影響する ● API19以上なら(現状は)std-jdk7で問題なさそう ○ “AutoClosable”APIがAPI19からサポート ○ “try-with-resource”は全てのAPiでサポート 5

Slide 6

Slide 6 text

Rx-Streamを置き換える 必要なものを選り分ける 2

Slide 7

Slide 7 text

Java7以下でListのStreamAPI ● “for + if” を “filter” で ● “flatMap” で入れ子リストの操作 Rx-Sreamの 利用シーン サーバーAPIへのアクセス ● HTTP GETをSingleで ● HTTP 204をCompletableで 7

Slide 8

Slide 8 text

RxJavaは必要? ● Observe.fromIterableをKotlinのList.forEachに ● SingleによるGET/POST処理をasync/awaitに ● RxAndroidによるUIスレッド指定(するなら)runBlockingに Rxが必要な箇所を洗い出すことで、 強力なRxの処理を十分に検討して利用できるように 8

Slide 9

Slide 9 text

Enum + Kotlin Extension 定数定義と定数定義を利用する処理を切り分ける 3

Slide 10

Slide 10 text

Enumの役割 - パターンの列挙 - When文との組み合わせによる 処理分岐 Enumを純粋な列挙 にする Enumで実行したい事柄 - パターンに応じた文字列 - Enumの表現に合わせた 表示/非表示の組み合わせ 10

Slide 11

Slide 11 text

例:UserTypeを定義する enum UserType(val code: String) { FREE(“free”), PREMIUM(“premium”) } fun UserType.stringResId() = when(this) { UserType.FREE -> R.string.plan_free // 無料プラン USerType.PREMIUM -> R.string.plan_premium // 課金プラン else -> R.string.other // その他 } 11

Slide 12

Slide 12 text

利用しやすいEnum ● 要素の追加、削除がしやすいと利用しやすい ○ 列挙項目の増減時に考えることが少ないこと ○ アプリ内で1つの概念を1つのEnumで表現できること ● フィールドに過不足がない ○ 「とりあえずnull」の必要がない ○ “R.hoge.hugahuga”による改行が発生しない 12

Slide 13

Slide 13 text

2つのKotlin Data Class 通信処理用のクラスと内部処理用の2つのData Class 4

Slide 14

Slide 14 text

API変換用 ● プリミティブ型で構成 ● Proguardを考慮 2つのData Class を 使い分ける アプリロジック用 ● アプリの内部クラスも利用 ● Proguardは考慮しない 14

Slide 15

Slide 15 text

APIレスポンスから Data Classを作る 15 JSON Data Class

Slide 16

Slide 16 text

オブジェクトの目的 16 JSON Data Class Data Class Server API Response サーバー処理の結果 DBからの取得結果 JSON Parsed Class APIレスポンスを JVM上で簡単に扱う In-App Data アプリのロジックや UI表示に対応

Slide 17

Slide 17 text

オブジェクトの特徴 17 JSON Data Class Data Class Server API Response パラメータの追加/削除 に対応しやすい JSON Parsed Class APIレスポンスの更新に 対応しやすい In-App Data アプリロジックの更新に 対応しやすい

Slide 18

Slide 18 text

アプリメリット ● equal判定が可能なため比較や並べ替えが容易 ○ RecyclerView + ListAdapterによる差分更新 ● 変換が容易 ○ Data Classから別のData Classを作成して扱う ○ Entity AnnotationをつけてRoomで扱う 18

Slide 19

Slide 19 text

Coroutines + Result Kotlin Coroutinesの結果をUIに伝播させる 5

Slide 20

Slide 20 text

通信状態をUIに反映 ● ユーザーに次の動作を伝えるために必要 ○ 通信中か通信中ではないか ○ 通信は成功したか失敗したか 非同期処理の状態をActivity/Fragmentにどう引っ張ってくるか 20

Slide 21

Slide 21 text

Resource ● status(Status), msg(String?), data(T?) ● Statusの定義 ○ success ○ error ○ loading AACサンプル NetworkState ● status(Status), msg(String?) ● Statusの定義 ○ LOADED ○ LOADING ○ error 21 https://github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/app/src/main/java/com/android/example/github/vo/Resource.kt https://github.com/googlesamples/android-architecture-components/blob/master/PagingWithNetworkSample/app/src/main/java/com/android/example/paging/pagingwithnetwork/reddit/repository/NetworkState.kt

Slide 22

Slide 22 text

A discriminated union that encapsulates successful outcome with a value of type T or a failure with an arbitrary Throwable exception. 22 kotlin-stdlib/ kotlin/Result

Slide 23

Slide 23 text

launch { state.postValue(State.LOADING) // 通信開始 runCaching { repository.user() // Coroutinesによる通信 }.fold( onSuccess = { user.post(it) // 通信結果 state.postValue(State.LOADED) // 通信成功 }, onFailure = { state.postValue(State.error(it)) // 通信失敗 } } ※StateクラスはNetworkStateクラスのThrowable?を保持する独自拡張クラス 23

Slide 24

Slide 24 text

+ LiveDataを推進 ● ViewModel ○ Model層から受け取るCoroutinesをResultで表現 ○ Resultの結果をLiveDataに変換 ● View ○ ViewModel層からLiveDataでデータを取得 ○ 正常/異常の状態に応じたUIを提供 24

Slide 25

Slide 25 text

“ Kotlinでもっと便利に! 25

Slide 26

Slide 26 text

26 Thanks! Any questions? You can find me at @koji-1009 & koji,[email protected]

Slide 27

Slide 27 text

Credits Special thanks to all the people who made and released these awesome resources for free: ● Presentation template by SlidesCarnival ● Photographs by Unsplash 27