X

Architecture Components:Google I/O 2017セッションレポート

本日からしばらくGoogle I/O 2017 のAndroidセッションをまとめたセッションリポートをお届けします。今回はArchitecture Componentsの3セッションが対象です。

Google I/Oは例年、セッションを公開していますが全部見るのはいうまでもなく大変です。開発者の視点から各セッションの感想をまとめてみました。

興味のある技術をピックアップする手助け、また技術を知る手助けになればうれしいです。既にお気づきかもしれませんが、50本超の動画を一気にみているので疲れからまたは興味の薄れから言及が少ないセッションがあります。また興味のあるセッションは詳細な紹介になっています(なってしまいました)。

まとめるにあたってTechBooster の執筆者との感想戦やGoogle I/O 参加者との雑談、こうなればいいなという開発者からみた技術的展望、カンファレンス当日にスピーカーに突撃して聞いた質問と回答が混じって錬成されています。あらかじめご了承ください&こういうものなんだな、と楽しんでください

Architecture Components

今回、紹介するアーキテクチャコンポーネントはGoogle I/Oではじめて紹介されたサポートライブラリです。まだアルファリリースということで変更が入るかもしれませんが、Google I/Oでも注目度の高いセッションでした。各セッションは独立して見ても理解できるように構成しています(一方で、内容の重複もあるのでさっき聞いたな、とおもったら飛ばしてもいいでしょう)。紹介にあたってはアプリを作る上で解決したい課題とアーキテクチャコンポーネントの解決方法(提案手法)を中心にまとめています。

Introduction

Architecture ComponentsはGoogle I/O 2017で発表されたSupport Library です。ActivityやFragmentはモバイル端末に特化したライフサイクルを持っており、アプリの状態にあわせてコードを書いていく…というスタイルはAndroid 開発者にとってはおなじみともいえます。しかし複数のFragmentの連携などを考慮しだすとライフサイクルが複雑に絡み合い、メモリリークやデータ保存の失敗など制御の難しさが目立ちました。

Architecture ComponentsはActivityとFragmentを対象としており、これらライフサイクルのハンドリングを手助けしてくれます。流行のリアクティブプログラミングも取り入れており、シンプルにコードが書けるよう考えられています。Activity のリスナーやデータの保持など操作しやすくなる効果が期待できるSupport Library です。

Solving the Lifecycle Problem

ライフサイクルが持つ問題とはonResume やonPause などイベント発生にあわせてハンドリングすべき要素が規模に応じて複雑になっていくことでした。多くの処理を同じメソッド内に書き、相互の依存関係がわかりにくくなって破綻するケースを見たことはありませんか?

Architecture Componentsではライフサイクルのイベントを受け取るLifecycleObserverとイベントを管理するLyfecycleOwner を組み合わせて、この問題を解決しようとしています。Observerを通じてイベントを伝えることで、状態管理をより簡単にしてデータの処理そのものに注目できるようになります。またLifecycleObserverを実装したLiveDataはライフサイクルにあわせた寿命を持ち、ステート管理など面倒もありません。

LiveData を使おうとした場合、ViewModelを用意すると良いでしょう。ViewModelはMVVM のViewModel とは異なる役割をもち、主にUI データ(LiveData のような)を管理し、Fragment の間でのデータ共有などが行えます。Architecture ComponentsのViewModel ではView 操作は禁止されており、Context やリソースなどの利用も想定外です。このようなリソース管理についてはActivityやFragmentの役割です。

Persistence and Offline

Architecture Components を構成するコンポーネンツのひとつ、Roomについて解説します。Roomはデータベース技術SQLite のWrapperとして動作しています。SQLiteはAndroid の最初期から利用されている技術です。

セッションではRoomがどのようにデータベースを操作するのか、ソースコードを元に説明していきます。データ構造に対してアノテーションをつけて利用する、クエリを書く方法など簡単な操作から始まり、複雑なデータ構造の表現方法について理解できます。また独自にデータベースの遅延ロードなどを実装してしまうとUIスレッドでのANRを引き起こしかねません。Roomではクエリを使い、SQLの文法にのっとりながら(実行速度も高速なまま)解決できます。

mhidaka: Software Engineerだよ。DroidKaigi Organizer / Androidと組込とRe:VIEW。techbooster主宰。mhidaka's writings http://booklog.jp/users/mhidaka 技術書典! http://techbookfest.org