弥生開発者ブログ弥生開発者ブログ2020-12-14AndroidアプリにViewModelを導入しましたモバイルはじめまして。Misocaモバイルチームのtijinsです。この記事は、弥生アドベントカレンダー14日目の記事です。MVPからMVVMへAndroid版MisocaはModel-View-Presenter構造で作られていたのですが、Model-View-ViewModel構造へのリファクタリングが完了しました。コードがスッキリしたので、リファクタリングの内容を紹介します。MVPパターンとMVVMパターンModel-View-Presenter(MVPパターン)MVPパターンでは、PresenterがViewの参照(intrefaceで)を保持し、結果をViewに表示します。Viewを直接参照せずにInterfaceにしておくことで、PresenterからViewの依存を排除しています。ModelModel-View-ViewModel(MVVMパターン)MVVMパターンでは、ViewModelからViewの参照は不要です。表示用のデータはViewModelが保持しており、ViewがViewModel上のデータを監視(Observe)して表示します。Model:操作結果により、ViewModel上のデータを更新するViewModel化のメリットViewModelにも色々あるみたいなのですが、ここでのViewModelはデータを保持できるPresenterといった感じです。PresenterからViewの参照を排除できるViewModel化前は、Presenterに非同期処理完了のコールバックとして、Viewの参照を(interfaceとしてですが)渡していました。ViewModelを利用すると、ViewModelからViewへの参照は不要になります。AndroidアプリでのViewModelのメリットFragmentでもActivityライフサイクルでのデータ保持が可能Fragmentにデータを保持していると、画面の回転等でFragmentが破棄された際に、データの読み込みが必要でした。ActivityライフサイクルのViewModelを利用する事で、Fragmentが破棄されても、データの引き継ぎが可能になります。ライフサイクル管理の単純化Presenterが行う非同期処理の結果をFragmentで表示する場合、先にFragmentが破棄されていると、クラッシュしてしまう問題がありました。ViewModelのライフサイクルはFragmentから分離されている為、Fragmentの状態を気にせずに、非同期処理が可能です。リファクタリング前のコード最初にリファクタリング前のコードです。Viewを直接参照しないのは、PresenterからViewの依存を排除する為です。しておくと、テスト用のダミークラスに差し替えたりできます。}}リファクタリング後のコードViewModelの実装ViewModelからFragmentへの参照が無くなり、すっきりしていると思います。RepositoryItemsViewModel.ktMisocaのAndroid版では、APIとの通信にContextが必要な為、AndroidViewModelを継承しています。AndroidViewModelを継承することで、ApplicationContextをgetApplication()で参照可能になります。ApplicationContextには言語設定や画面向きの変更が反映されない為、ViewModel内でUIに関する処理を行わないよう注意が必要です。functionです。}}NetworkStateの実装は、下記のコードを参考にしました。https://github.com/android/architecture-components-samples/tree/master/PagingWithNetworkSampleViewModel上のデータ変更を監視するViewModelをFragmentから使う場合は、fragment-ktxにあるExtension(viewModels,activityViewModels)を使用すると便利です。}}おまけこの画面は2つのタブがそれぞれFragmentになっているのですが、ViewModelを通じて2つのタブがデータを共有しています。タブ間(Fragment間)でのデータの移動も、ViewModelを使用する事で、簡単に実現できています。Android)を募集しています。Navigationを使った画面遷移でFragmentとステータスバーのThemeを...弥生モバイルチームのtijinsです。MisoaアプリにNavigationコ...2021-06-11Androidアプリのテストを自動化こんにちはmisocaアプリの評価が3.5になって嬉しいtijinsです。前に背骨の手術を受けたら...2016-12-22Grape+SwaggerでAPIのドキュメント作成を自動化したこんにちは、Misoca開発チームのいっしーです。弥生は第23回Quesに協賛します。引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。