web-dev-qa-db-ja.com

MVVMのActivity / FragmentとViewModelで何をすべきか

当社はしばらくの間、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
    }
}
11
Tar_Tw45

はい、ViewModelにすべてのビジネスロジックを含めることができます。MVVMを学ぶために私が個人的にたどるリンクをいくつか示します。

アプローチAndroid MVVMを使用
https://github.com/ivacf/archi
Android上のMVVM:知っておくべきこと

ViewModelのすべてのリスナーと、モデルを構成するデータについて言及できます。

ViewModelは一部のコンテンツを変更し、コンテンツが変更されたことをバインディングフレームワークに通知します。

モデル-ビジネスロジックと検証ロジックを含むデータモデル
ビュー-画面上のビューの構造、レイアウト、および外観を定義します
ViewModel-ビューとモデル間のリンクとして機能し、任意のビューロジックを処理します

enter image description here

参照

7
Ravi Rupareliya

アクティビティでリスナーを設定しないでください。

ロジックは、可能な限りViewModelに書き込む必要があります。

少し前にMVVM(Databinding)のデモを書きました。

お役に立てば幸いです。

https://github.com/adgvcxz/Dribbble-MVVM

0
adgvcxz

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つの異なる形式で記述されています

0
saksham