Android Kotlin Fundamentals をやった

はじめに

Googleが出しているandroid開発に関するチュートリアルについての備忘録です(※以前書いた記事を移行してきたものになります)。 https://codelabs.developers.google.com/codelabs/kotlin-android-training-welcome

ネイティブアプリ開発は他の言語を学ぶのと違って、最初は必要な知識量が多くて戸惑うと思います(Activity、Fragment、DataBinding 、ViewModel、LiveData、RecyclerViewなど)。 ただ、このチュートリアルさえ読んでおけば、結構ちゃんとしたアプリが書けるようになるんじゃないかと思います。無料で公開してくれていますし、かなりおすすめです。

これを学んでから作ったアプリもあるので、サンプルとして参考にしていただければと思います。ハッカソン用に作ったアプリです(当時ネイティブアプリ開発経験は0でしたが、ここまで書けるようになりました)。

https://github.com/tonouchi510/navitime-challenge

チュートリアル紹介

それではチュートリアルの各章について概要をメモしていきます。

チュートリアル内容メモ

Lesson 1: Build your first app

Lesson 2: Layouts

  • 特にdata bindingの部分が重要。基本的にdata bindingは有効にして開発していくべき
    • 従来のfindViewByIdで毎回階層をたどるのではなく、各ビューへの参照を含むオブジェクトを作成する
    • アプリ起動時のみオブジェクト生成のための捜査が走る

Lesson 3: Navigation

  • Activity(ページ)単位だけでなくFragment(コンポーネント)単位でビューを開発できるようになったという話
  • ここはあまり読んでない

Lesson 4: Activity and fragment lifecycles

  • Androidの(Activity&Fragment)のライフサイクルおよびライフサイクルメソッドについて学べる
    • アプリの各時点でログを出力してライフサイクルメソッドの呼び出しタイミングを確認する
    • パフォーマンスとかが問題になった時にここを復習してちゃんとライフサイクルメソッド駆使すると良さそう

Lesson 5: Architecture components

  • この辺から初学者は結構しんどくなる
  • ViewModelとかMVVMについて学べる
    • Androidアプリはそのままでは画面回転などの再レンダリングでデータを保持できない→ViewModelで管理
  • アプリのデータ変化を監視し、ビューに通知するためのLiveDataクラスも導入する
  • DataBindingと組み合わせると結構きれいに書ける(ていうかViewについてはほぼコーディングいらない)

Lesson 6: Room database and coroutines

  • データを永続化するための方法が学べる
    • Roomは便利なSQLiteとのインタラクション用ライブラリ
  • kotlin coroutineでデータベース操作をメインスレッドから分離する方法も学べる

Lesson 7: RecyclerView

  • 最適化されたリスト表示のためのライブラリ
    • 画面に表れる必要な部分だけデータのレンダリングが走る
    • 実装しようと思うと結構複雑だった

Lesson 8: Connecting to the internet

  • 外部のAPIを使うためのチュートリアル
    • ここで紹介されているretrofitというライブラリを使うのが良さそう
  • Android emulatorのDNSの設定やアンチウイルスソフトが原因でネットワークアクセスエラーになる場合もある
    • チュートリアル関係ないが、firebaseと接続するアプリ作った時にエラーが起こった
    • エラーがわかりにくいので注意

Lesson 9: Repository

  • いわゆるrepository層の導入
    • 複数データソースとのインタラクションの抽象化(ViewModelに合わせてデータ構築)
    • Roomを使ったオフラインキャッシュからの取得とネットワークアクセスによるリフレッシュ

Android アプリ開発の推奨アーキテクチャ

[ディレクトリ構成]

.
├── database    # Roomデータベースの作成、データベースのエンティティ・DAOの定義とか。
├── domain    # ドメイン層。アプリが使う形のデータを定義・表現する。
├── network    # 外部サービスとの連携・APIアクセス周り。Retrofit2のオブジェクトを作成する。
├── repository    # DBやネットワークなど複数のデータソースとのやり取りを抽象化する。
├── ui    # activityとかfragmentを置く。Data BindingでViewModelからのデータを表示したりユーザからの入力を伝える。
└── viewmodel    # 表示するデータの生成・変換やユーザのデータ入力の処理を行う。UI層との依存関係を持たないようにすべき

f:id:tonotech:20191029020340p:plain
アーキテクチャ

このチュートリアルだけで結構きれいに書けるようになるんじゃないかと思います。 加えてアプリ開発にクリーンアーキテクチャを入れてたりするケースも聞きますが、個人的にはネイティブにいらない(このチュートリアルの話)で十分ではないかと思います。