このアプリはMVIの学習のために制作したアプリとなります。
QRコードを読み込むと自動的にブラウザアプリが開き、読み込んだQRコードのURLを表示します。
QRコードの読み込み・アイドル状態をIntentとし、ViewModel内で処理をした後にStateに変換され、Viewへの指示が行われる1方通行のデータの流れになっています。
QRコードのスキャンはオートフォーカスに対応しており、画面上をタップすることでタップした位置にフォーカスするようにもなっています。
- Android Studio Arctic Fox 2020.3.1 Beta 3
- Android 5.0以上
https://developer.android.com/studio/preview
- Dagger Hilt
- ML Kit
- Android Jetpack (CameraXなど)
次のQRコードを読み込むと今見ているこのページが表示されれます。
MVIはFluxなどと同じ単方向データフローを採用したもので、昨今Androidアプリでの採用が増えつつあるアーキテクチャになります。
状態を管理するのに特化しているため、状態を利用するJetpack Composeとも相性がいいと公式でも紹介されています。
https://developer.android.com/jetpack/compose/architecture?hl=ja
AndroidではViewやネットワーク・リポジトリなどの状態が多くあり、状態の管理が複雑化しやすい傾向にあります。
MVIは単方向データフロー(UDF, Unidirectional Data Flow)を採用し、一方向にしかデータ・状態が流れないようになっています。
一つのフローで流れる状態は不変であり変わることはないようになっています。
これにより各レイヤーでの役割が明確になり、関心の分離が行えた状態になります。
シンプルにできるためデバッグ・テストなど保守性が高くできる狙いがあります。
副作用(データの変換・計算など)が発生するレイヤーはIntent・Processor・Renderに限定されており、副作用はこれらのレイヤーだけを注意すればよくなっています。
大まかにMVIを説明すると次のようになる。
ビジネスロジックの箇所になります。ViewModelが担当する。 Processorレイヤーが担当する。
ユーザーに表示する部分となるため、ActivityやFragmentが担当する。 データフローの開始地点であり、終了地点ともなる。 Viewからユーザーのイベントが開始となり、Intentとして流れ、Modelで処理され、RenderによってViewへ状態を反映し戻る流れとなる。
AndroidフレームワークのIntentとは別なもの。 タップなどユーザーが操作し発生したイベントを指す。
- 状態が不変となるため状態管理が楽になる。
- 単方向データフローとなるため、それぞれのレイヤーでの役割がシンプルになり、副作用も特定のレイヤーでしか発生しないため保守性が高くなる。
- 単体テストはViewとModelが完全に分離されているため作成がしやすくなる。
- アーキテクチャの概念が若干複雑なため、学習コストがかかるように感じられる。
- レイヤーが多くなるため、単純な処理でも多くのボイラープレートが増えてしまう。
- トースト・スナックバーなどは構成の変更が発生した場合に状態の管理が難しいため、難しいとされている。
使用するのに複雑な手順を要するCamera2を簡単に使用できるようにしたラッパー。 プレビュー・画像解析・画像キャプチャが使用できる。 CameraXに指定したライフサイクルを関連付けできるようになっており、指定したライフサイクルがアクティブな場合だけカメラを有効にし、アクティブでない場合は破棄するようにして無駄なリソース消費を抑えることができる。
カメラデバイスの設定をCameraXで判断し自動で設定を行うようになっており、デバイス依存のコードを書く必要がない。 利用可能な解像度・アスペクトの判定も行い、最適なものをライブラリで自動的に選択する仕組みとなっている。 Camera2では自分でデバイス固有の構成を管理する必要があった。