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