Android Advanced MVVM + DataBindingフレームワークモード(更新)

MVVMフレームワーク

MVVMアーキテクチャの概要
C#には非常に早い段階でMVVM開発モデルがあり、Android携帯電話のMVVMは、遅すぎることなく、昨年のGoogleのI\O会議までリリースされませんでした。言うまでもなく、MVVMの開発モードの利点は、ビューとロジックコードの分離を実現できます。さらに、Googleによると、MVVMの開発モードを使用すると、レイアウトファイルの解析速度も向上する可能性があります。これは非常に優れていると思います。重要。重要。Android開発では多くのfindViewByIdを作成する必要があり、これは煩わしいことです。多くの人は皇帝を書きたくないので、いくつかのアノテーションフレームワークを使用します。ただし、アノテーションフレームワークのパフォーマンスがどれほど優れていても、効率は高くなります。は常にfindViewByIdの値よりも低くなります。したがって、Android MVVMまたはデータバインディングでは、この問題を完全に解決するのに役立ちます。

MVVMフレームワークは、データとビューのバインディング(DataBinding)を実装します。データが変更されると、ビューは自動的に更新されます。逆に、ビューが変更されると、データは自動的に新しい
ここに画像の説明を挿入
MVVMモードになります。MVPモードと同様に、また、アプリケーションを3つのレイヤーに分割し、対応する各レイヤーの責任は類似しています。

  • モデルレイヤー主にデータの提供を担当します。モデル層は、ビジネスロジック(エンティティクラスなど)のデータ構造を提供し、データ取得(ローカルデータベースまたはリモートネットワークからデータを取得するなど)を提供し、データストレージを提供します
  • ビューレイヤー主にインターフェイスの表示を担当します。Viewレイヤーには、ビジネスロジック処理は含まれていません。ViewModelレイヤーへの参照を保持し、ビジネスロジック処理が必要になったときにViewModelレイヤーに通知します。
  • ViewModelレイヤー主にビジネスロジックの処理を担当します。ViewModelレイヤーには、ビュー操作は含まれません。公式に提供されているデータバインディングライブラリを介して、ViewレイヤーとViewModelレイヤーのデータをバインドでき、ViewModelレイヤーのデータの変更により、Viewレイヤーに更新を自動的に通知できるため、ViewModelレイヤーはビューレイヤーへの参照。ViewModelレイヤーは、ViewレイヤーとPresenterレイヤーのデータモデルの組み合わせと見なすことができます。

MVVMパターンとMVPパターンの最大の違いは、ViewModelレイヤーがViewレイヤーへの参照を保持していないことです。これにより、結合がさらに減少し、Viewレイヤーコードを変更してもViewModelレイヤーに影響はありません。

MVVMパターンには、MVPパターンに比べて次の利点があります。

  • カップリングはさらに減少します。ViewModelレイヤーは、Viewレイヤーへの参照を保持しません。Viewレイヤーが変更された場合、Viewレイヤーにバインドされたデータが変更されない限り、ViewModelレイヤーを変更する必要はありません。MVPモードでは、ビューレイヤーが変更された場合、それに応じてビューを操作するためのインターフェイスを変更する必要があるため、プレゼンターレイヤーを変更する必要があります。
  • 書くべき定型コードはもうありません。公式のデータバインディングライブラリを介して、UIとデータ間のバインディングを実現でき、findViewById()および操作ビュー用の多くのコードを記述する必要はありません。つまり、Activity/Fragmentのコードは非常に簡潔にすることができます

1. DataBindingを使用する手順:

  • enableDataBinding
  • レイアウトファイルをDataBindingレイアウトに変更します
  • データバインディング

次に、MVVMフレームワークの手順を使用します。

  • View、ViewModel、Modelの3つのレイヤーを提供します
  • レイアウトをDataBindingレイアウトに変更します
  • DataBindingを介したViewとViewModel間の通信
  • データを取得してインターフェースに表示する

MVVMのフルネームは、モデル(モデル)–ビュー(ビュー)–ビューモデル(ビューモデル)です。

MVVMは、PresenterをVIewModelに変更した、MVPのアップグレードバージョンと見なすことができます。重要なのは、ビューとモデル間の双方向バインディングです。ビューにユーザー入力がある場合、ViewModelはモデルにデータを更新するように通知します。同様に、モデルデータが更新された後、ViewModelはビューに更新を通知します。

MVVMの利点は次のとおりです
。1。ビューとモデルは両方向にバインドされます。一方の変更はもう一方の側に影響するため、開発者はUIデータを手動で変更する必要は
ありません。2。findViewByIdまたはバターナイフ、およびデータバインディングリスナーなどを設定するために特定のビューを取得する必要はありません。これらはDataBinding
3で完了できます。ビューとモデルの双方向バインディングはライフサイクル検出をサポートし、ページについて心配する必要はありません。破棄とコールバック。これはlifeCycleによって行われます。4。MVCとは異なり
、Activityのコードの量は膨大であり、MVPのようなViewおよびPresenterインターフェイスは多数ありません。プロジェクト構造はあまり結合されていません

データバインディングとは

DataBindingは、Googleが正式にリリースしたフレームワークです。名前が示すように、データバインディングです。これは、AndroidでのMVVMパターンの実装です。レイアウトとロジックの結合を減らし、コードロジックを明確にするために使用されます。

次に、
最初にトピックを入力してデータバインディングを有効にします。DataBindingを
有効にする方法は、対応するモデルのbuild.gradleファイルに次のコードを追加することです。同期後、DataBindingのサポートを導入できます。

android {
    
    
    ...
    dataBinding {
    
    
        enabled = true
    }
}

以下は詳細な紹介ですMVVMフレームワーク: 1。VM

レイヤー:
ここでは、MVVMActivityのレイアウトファイルactivity_mvvmpatternに従って、データバインディングが導入されています。

データバインディングには、使用する環境に対して特定の要件があります。AndroidStudioのバージョンは1.3より上であり、gradleのバージョンは1.5.0-alpha1より上である必要があります。
AndroidSDKマネージャーでAndroidサポートリポジトリをダウンロードする必要があります

次に、対応するモジュールのbuild.gradleを追加します。

android {
    
    
  ....
  dataBinding {
    
    
      enabled =true
  }
}

次に、データバインディング構文を使用してxmlをデータバインドし、Clickイベントと出力結果をVMにバインドします

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
         <!--使用import来导入需要用的包-->
        <import type="android.view.View" />
         <!--使用关键字variable来声明一个变量,name为变量名,type为指向的对象,可以是类名也可以是类名的别名-->
        <variable
            name="userViewModel"
            type="com.mvvm.model.mvvm.viewmodel.MVVMDataViewModel" />

        <variable
            name="handlers"
            type="com.mvvm.model.mvvm.view.MVVMActivity" />
        <!--对于基本类型,可以像java代码一样不用去导入包,直接使用-->
        <variable
            name="data"
            type="String" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Button
            android:id="@+id/btnMVVM"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{handlers.onClickLoadData}"
            android:text="点击请求数据" />

        <Button
            android:id="@+id/btnToast"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{handlers.onClickShowToastName}"
            android:text="点击请求数据并Toast提示" />
            
        <!--使用变量-->
        <TextView
            android:id="@+id/tvData"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@{userViewModel.data}" />
    </LinearLayout>
</layout>

データで定義された変数ノードでは、name属性は変数の名前を表し、typeは変数の型を表し、インスタンスはエンティティクラスの場所です。もちろん、ここで次のように変更することもできます。

<data>
        <import type="android.view.View" />
        <variable
            name="userViewModel"
            type="com.mvvm.model.mvvm.viewmodel.MVVMDataViewModel" />
    </data>

BaseObservable、observable:
例としてObserverまたはMVVMDataViewModelクラス、BaseObservableはUIを更新する2つのメソッド、つまりnotifyPropertyChanged()とnotifyChange()を提供し
   ます。1。notifyPropertyChanged();は、コードと同様に、それに属するUIのみを更新します。更新名前
   2.notifyChange();を更新しますすべてのUIを更新します

BeanクラスはBaseObservableを継承します
notifyPropertyChanged()は、int型のパラメーターを渡す必要があります。これは、正式なパラメーター名を参照するintfieldIdです。

Bindableは、データをビューにバインドするために使用されます
VMレイヤー固有のクラス:@Bindableを特定の属性に追加する必要があることに注意してください。そうしないと、バインディングが無効になります。

public class MVVMDataViewModel extends BaseObservable implements MVVMLoadDataCallback{
    
    
    private MVVMDataModel model;

    public MVVMDataViewModel() {
    
    
        model = new MVVMDataModel();
    }

    /**
     * 必须添加@Bindable注释
     * @return
     */
    @Bindable
    public String getData() {
    
    
        return model.mData;
    }

    public void loadUserData() {
    
    
        model.requestData(this);
    }

    @Override
    public void onSuccess() {
    
    
        notifyPropertyChanged(com.mvvm.model.BR.data);
    }

    @Override
    public void onFailure() {
    
    

    }
}

独自のプロジェクトまたは3番目のBR2の下でBRを選択します

。ビューレイヤー(MVVMActivity)はVMを導入します。

/**
 * View层
 */
public class MVVMActivity extends AppCompatActivity {
    
    
    private MVVMDataViewModel userViewModel;
    private TextView tvData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        ActivityMvvmpatternBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_mvvmpattern);
        userViewModel = new MVVMDataViewModel();
        binding.setUserViewModel(userViewModel);
        binding.setHandlers(this);

        tvData = binding.tvData;

    }

    public void onClickShowToastName(View view) {
    
    
        Toast.makeText(this, tvData.getText().toString(), Toast.LENGTH_LONG).show();
    }

    public void onClickLoadData(View view) {
    
    
        userViewModel.loadUserData();
    }
}

3.モデルレイヤー:
特定のデータリクエスト操作に使用されます

/**
 * Model层
 */
public class MVVMDataModel {
    
    
    public String mData;
 
    public MVVMDataModel() {
    
    
        this.mData = "初始数据";
    }
 
    public void requestData(MVVMLoadDataCallback callback) {
    
    
        this.mData = "数据请求成功";
        callback.onSuccess();
    }
}

MVVMにはこれらの利点がありますが、使用するピットも多いため、MVPフレームワークの開発を中心とした実際の開発では、MVVMフレームワークのアプリケーションは多くありません。

最後に、参照用のgithubソースコードを提供します:testMVVM

おすすめ

転載: blog.csdn.net/qq_35091074/article/details/123351470