Giter Site home page Giter Site logo

learningmvi's Introduction

Learning MVI

このアプリは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

次のQRコードを読み込むと今見ているこのページが表示されれます。

QR

MVIについて

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を説明すると次のようになる。

Model

ビジネスロジックの箇所になります。ViewModelが担当する。 Processorレイヤーが担当する。

View

ユーザーに表示する部分となるため、ActivityやFragmentが担当する。 データフローの開始地点であり、終了地点ともなる。 Viewからユーザーのイベントが開始となり、Intentとして流れ、Modelで処理され、RenderによってViewへ状態を反映し戻る流れとなる。

Intent

AndroidフレームワークのIntentとは別なもの。 タップなどユーザーが操作し発生したイベントを指す。

MVIのメリット・デメリット

メリット

  • 状態が不変となるため状態管理が楽になる。
  • 単方向データフローとなるため、それぞれのレイヤーでの役割がシンプルになり、副作用も特定のレイヤーでしか発生しないため保守性が高くなる。
  • 単体テストはViewとModelが完全に分離されているため作成がしやすくなる。

デメリット

  • アーキテクチャの概念が若干複雑なため、学習コストがかかるように感じられる。
  • レイヤーが多くなるため、単純な処理でも多くのボイラープレートが増えてしまう。
  • トースト・スナックバーなどは構成の変更が発生した場合に状態の管理が難しいため、難しいとされている。

CameraX

使用するのに複雑な手順を要するCamera2を簡単に使用できるようにしたラッパー。 プレビュー・画像解析・画像キャプチャが使用できる。 CameraXに指定したライフサイクルを関連付けできるようになっており、指定したライフサイクルがアクティブな場合だけカメラを有効にし、アクティブでない場合は破棄するようにして無駄なリソース消費を抑えることができる。

カメラデバイスの設定をCameraXで判断し自動で設定を行うようになっており、デバイス依存のコードを書く必要がない。 利用可能な解像度・アスペクトの判定も行い、最適なものをライブラリで自動的に選択する仕組みとなっている。 Camera2では自分でデバイス固有の構成を管理する必要があった。

learningmvi's People

Contributors

ki-0302 avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.