2020年2月21日金曜日

Application と ViewModel の使い分けはどうすればいいのか?

Activity か Fragment を基点として「ある程度安定して動けばいいや」的スタイルで Android プログラミングを続けてきたので、Application はたまに使用例に従って採用していただけで、主体的に判断して使用したことはない。それで最近、ボンヤリと、Android プログラミングに関する情報を調べていたら、Activity のライフサイクルに巻き込まれない、モデル(ビジネスロジック)的なデータは Application で扱う(格納する)べしみたいな話があって、ちょっと気になっていた。

その辺りは特に他のアイデアがなく、自分は Activity や Fragment でそのままデータを持たせていたので、onSaveInstanceState / onRestoreInstanceState で Bundle を使って退避してライフサイクルの輪廻転生をくぐり抜けられるようにしたり、SharedPreferences を使って逐次 Persistent なデータとして退避するなどして、力技で対抗していた。

Application を使えば、もうちょっと楽にできたのかなと思って気にしていたところ、ViewModel なんてものも存在することを(今さら)知り、Application と ViewModel の使い分けでどうなんだろう? と思った。もちろん、継承関係からしてそもそも存在意義が全然違うんだろうけど、「Activity のライフサイクルの輪廻転生をくぐり抜けて過去・現在・未来の三世を通じた一貫した記憶を保つ」という意味で、Application を使うか ViewModel を使うかといことに、どういう違いがあるのだろうかといことだ。

まあそもそも、Application の方は、ライフサイクルというよりは、スコープ的なグローバル性やシングルトン性の方がテーマとなるのだろうし、ViewModel の方はライフサイクルまで Activity に巻き添えを食らわないというだけで、あくまでも Activity / Fragment に従属したローカルなインスタンスなんだろうけど。

書いているうちに、全然違うよね〜、誰も疑問に思わないよね〜、という気持ちになってきた……。

Model とは言っても、ViewModel で扱うデータなんて、所詮 UI 用のものであって、MVC の Model という訳ではないだろう。本来的な Model については、Application とか Singleton に所属させて扱うのが正解なんだろうね。


Singleton vs. Application

Application を Singleton 的な目的で使うことはよくある話だが、実際に Singleton を使うのか、Application を使うのかには、議論の余地があるようだ。公式リファレンスには以下のようにある:

★ Note: There is normally no need to subclass Application. In most situations, static singletons can provide the same functionality in a more modular way. If your singleton needs a global context (for example to register broadcast receivers), include Context.getApplicationContext() as a Context argument when invoking your singleton's getInstance() method.

この記述を見る限り、どちらかというと、Singleton 的なことをしたいのであれば、実際に Singleton を使う方がお勧めのようだ。global context を使いたいのであれば、Context.getApplicationContext() で得た Context オブジェクトを Singleton の getInstance() で引数として渡せば用が足るとしている。「Singleton 的なもので、さらに処理の中にグローバルコンテキストを扱うものが含まれるから Application を使う必要がある」と考えるのは誤解だということだ。Singleton の方がモジュール化された使い方ができるので、どちらかというとお勧めのようなニュアンス。

さらに、StackOverFlow の議論:Singletons vs. Application Context in Android? によると、ここでも Singleton 派と Application 派に分かれていて、両派とも対等な支持を得ているが、よりモジュール化、よりきめ細かいカスタム化を重視するのであれば Singleton、そうでない場合は Application という大雑把な認識でいいかな。

0 件のコメント:

コメントを投稿