当社はしばらくの間、MVPパターンを使用したAndroidアプリケーションを開発してきました。MVPでは、すべてのビジネスロジックをプレゼンター内に配置し、アクティビティ/フラグメントは、プレゼンターからイベントコールバックを受信したときのビューの更新のみを担当します。 。
ここで、Androidデータバインディングを使用してMVVMを試すことにしました。MVVMを使用すると、すべてのビジネスロジックをViewModelに配置し(MVPのPresenterと同様)、ビューに通知できるようです。 )データモデルへの変更をすべて1つのオブジェクトにまとめます。
しかし、それでは、これは私たちの心に疑問を投げかけます。アクティビティ/フラグメントによって処理されるために何を残すべきでしょうか? fat-activity/Fragmentを回避するためにMVPパターンを採用したため。 slim-activity/Fragment、次にfat-viewmodelは必要ありません。
これまでのところ、Activity/Fragmentで処理できると私たちが考えていること
私はMVVMにかなり慣れていないので、MVPに似ているように見えても、すべての修正、コメント、提案を歓迎します。
ありがとうございました。
もう少し質問
MVVMをリスナー(MVPなど)と組み合わせることが可能であり、良い習慣ですか?例えば
public class MainActivityViewModel extends BaseObservable {
MainActivityViewModelListener listener;
User user;
public void setMainActivityViewModelListener(MainActivityViewModelListener listener) {
this.listener = listener;
}
public void refreshUser(View v) {
// some user update via Internet
notifyPropertyChanged(BR.userAlias);
if (listener != null) {
listener.onUserRefreshed(user);
}
}
@Bindable
public void getUserAlias() {
return user.getAlias();
}
}
public interface MainActivityViewModelListener {
void onUserRefreshed(User user);
}
public class MainActivity implements MainActivityViewModelListener {
MainActivityBinding binding;
@Override
public void onCreate(Bundle savedInstanceState) {
binding = DataBindingUtil.setContentView(R.layout.main_activity);
MainActivityViewModel viewModel = new MainActivityViewModel();
viewModel.setMainActivityViewModelListener(this);
binding.setMainActivityViewModel(viewModel);
}
@Override
public void onUserRefreshed(User user) {
// do some update
}
}
はい、ViewModelにすべてのビジネスロジックを含めることができます。MVVMを学ぶために私が個人的にたどるリンクをいくつか示します。
アプローチAndroid MVVMを使用
https://github.com/ivacf/archi
Android上のMVVM:知っておくべきこと
ViewModelのすべてのリスナーと、モデルを構成するデータについて言及できます。
ViewModel
は一部のコンテンツを変更し、コンテンツが変更されたことをバインディングフレームワークに通知します。
モデル-ビジネスロジックと検証ロジックを含むデータモデル
ビュー-画面上のビューの構造、レイアウト、および外観を定義します
ViewModel-ビューとモデル間のリンクとして機能し、任意のビューロジックを処理します
アクティビティでリスナーを設定しないでください。
ロジックは、可能な限りViewModelに書き込む必要があります。
少し前にMVVM(Databinding)のデモを書きました。
お役に立てば幸いです。
Mvpの場合と同じように、mvvm内でインターフェイスリスナーを使用できるという質問への回答はありますか?はいですが、パターンはあなたが言及したコードと少し異なります
public interface MainActivityViewModelListener {
void onUserRefreshed(User user);
mvpタイプのデザインでは問題ありませんが、mvvmでは、適切なオブザーバーレジスタを使用し、オブザーバーへの通知を含むパターンの登録を解除する必要があります。
mvpではインターフェース関数を直接呼び出しますが、mvvmのオブザーバーパターンはこれらの単純なインターフェースとはかなり異なります。オブザーバーパターンには、クライアントクラスへのサブジェクト登録が含まれます。
mvvmがどのように正確に機能するかを知りたい場合は、こちらをご覧ください https://github.com/saksham24/Android-Firebase-Mvp-Mvc-Mvvm-chat
これは同じ機能を備えたシンプルなアプリケーションですが、mvpmvvmとmvcの違いを明確に理解できるように3つの異なる形式で記述されています