web-dev-qa-db-ja.com

Android MVVMのサービスとViewModels-それらはどのように相互作用しますか?

私はAndroidアーキテクチャからのViewModelsをしばらくの間使用しており、ViewModelをContext/Views(Android Framework/UI)に決して公開しないようにしていますが、最近、興味深いことに遭遇しました問題。

タイマーアプリを作成する場合、タイマーが開始されると、タイマーを実行しているバックグラウンドでサービスが実行されます。このように、アプリケーションが閉じられると、タイマーはすべてのタイマーが終了するまで通知バーのフォアグラウンドで実行されます。ただし、これは、すべてのTimerオブジェクトと状態がこのサービスに含まれていることを意味します。私のUIはティックごとに更新する必要がありますが、モデルを必ずしも更新する必要はありませんViewModelsはこのシナリオにどのように適合するのですか?

アクティビティはLocalBroadcastsを受け取り、毎回ViewModelに通知する必要がありますか? UI状態をService-> Activity-> VMから読み取る必要がありますか?サービスはViewModelのようですが、これは効率的ではありません。

14
Josh Ribeiro

さまざまな構造をいじってみた後、サービスはそれがMVVMに配置されていることを発見しました。この状況で私を驚かせたのは、サービスをViewModelから開始するべきではないと考えていて、2つのリポジトリが必要であるという事実でした。ステータスなど)。 ViewModelにはビューへの参照があってはなりませんが、アプリケーションコンテキストは問題ありません。したがって、ViewModelからサービスを開始するには、AndroidViewModelクラスを拡張します。これが最終的な構造です:

モデルレイヤー

  • Service-アクティブなタイマーのリストを維持し、onTick()EventBusイベントを発行し、アクティブなタイマーの再生/一時停止ステータスを維持します。アクティブなタイマーがなくなると終了します。
  • Room Database-将来使用するためにタイマーを保存します(名前、合計時間など)

ViewModel

  • ViewModel-UIイベントをリッスンし、ビジネスロジックを実行して、EventBus投稿を発行します。モデルの変更は、ViewModelを介して伝達されます

[〜#〜] ui [〜#〜]

  • Activity-アプリケーションフロータスクを実行します。関連するViewModel通信をリッスンして、フラグメントを交換したり、新しいアクティビティを開始したりします。
  • Fragment-アニメーションとUIを処理します。また、ViewModelにユーザー操作を通知します
0
Josh Ribeiro