MVVMでAndroidサンプルアプリ作った

 MVVMアーキテクチャで簡単なAndroidサンプルアプリを作ったのでそれについて書きます。

 設計・依存関係など少し意識して作られています。Androidアプリの理解が浅い人の参考になればと思います。

 

 

内容


 Twitter、GoogleのトレンドワードとiTunesの音楽情報がみれるアプリです。動作はこんな感じ↓

 

 

アプリの中身について


 MVVM, Data Bindingを適用しています。javaで書いています。

 MVVMについては別記事で解説しているのでそちらを参照してください。

Android MVVMについてまとめてみました。

クラス図とソースコードは以下の通りです。↓

https://gitlab.com/pei223/trendviewer

 PlantUML使って クラス図書いたのですが結構見にくいですね。。。

 

 

設計について軽く解説


 基本的に依存関係が一方向であり、common, common_interface, utilなどに集約しているため、機能追加がしやすい作りになっています。

 以下、それぞれのパッケージなどについて解説します。

 common, utilはどのクラスも共通で使うようなユーティリティなクラス群なので省略します。

 

common_interface

 common_interfaceに各コンテンツのmodelが継承するRequestToAccessAPIクラス、各ページのFragmentが継承するContentFragmentが入っています。

 RequestToAccessAPIはキャッシュ、APIアクセス制限処理など共通化できる処理が入っています。各modelは親クラスであるRequestToAccessAPIのメソッドを使うことで、自前で処理を書かずにキャッシュの取得など行えます。

 

common.Contents

 各ページの情報はcommon.Contentsに集約しています。ここにタブで使う画像のリソースIDやコンテンツ名、各ページに該当するクラスオブジェクトであるfragmentClass(ContentFragment)などが入っています。

 ここに新しい列挙子を追加し、view, viewmodel, modelを書いていくのみで新しいページを作成できるようになっています。その他の変更は必要ないです。

 

view

 view.TopFragmentPagerAdapterで、Contentsの全列挙子を使って各ページを描画していきます。リフレクションを使うことでfragmentClassから各ページのオブジェクトを生成して描画します。

 PagerAdapterはContents.values()で全列挙子を探索し、ContentFragmentを継承するfragmentClassを使ってページを描画します。

 fragmentClassはContentFragmentを継承であるため、PagerAdapterはContentFragmentクラスのみ知っていればどのコンテンツを描画しているかなど意識しなくて済みます。よって新しいコンテンツのページを追加してもview側は一切修正する必要がありません。

 

各コンテンツ(twitter, itunesなど)

 各コンテンツはview, viewmodel, model, entityで構成されます。

 view → viewmodel → modelという依存関係のため、viewはviewmodelだけ、viewmodelはmodelだけ知っていればよく、modelは他のコンポーネントを気にしなくて済みます。(一部viewmodelがviewを知っている箇所がありますが…)

 entityはviewmodel, modelの橋渡しをする役割です。

 キャッシュ機能やAPIアクセス制限などはmodelが担うため、view, viewmodelはキャッシュの結果だろうがAPIアクセスの結果だろうが何も意識せずに済みます。

 

 

新しいページの追加方法

 まずContentsに新しいページについての情報を記述し、新しいページに該当するパッケージを作ります。その中にview, viewmodel, modelを作ります。

 viewにはContentFragmentを継承したクラス, modelにはRequestAccessToAPIを継承したクラスを作って、あとは処理を書くだけです。