AndroidでのMVC、MVP、MVVMの紹介
7855 ワード
Androidプロジェクトでは、主にActivityとlayoutのレイアウトが用いられており、ほぼMVCの構造を呈しているが、Android開発でよく使われる開発モデルにはMVC、MVP、MVVMがあり、ここで簡単に紹介する.
一、MVC
Androidプロジェクトに着手して、初心者はすべてActivityを作成することを知っていて、それから1つのインタフェースを生んで、HelloWorldの旅を開きます.
このようなモードが存在するため、プロジェクトは自然にMVCモードを呈し、Model-View-Controller、layoutはレイアウトファイルとしてビューViewの役割を果たし、Activityは巨大なControllerとして、MとVを制御し、Viewはインタラクティブな要求を受け入れ、Controllerに要求を渡し、ControllerはModelを操作してデータ更新を行い、データ更新後、ModelはViewデータの変化を通知し、これにより、更新後のデータがViewに表示されます.
簡単な例:ログイン機能.
2つの入力ボックスEditTextとボタンButtonがあり、ユーザー名パスワードを入力してログインするLoginActivityを作成します.ログイン機能コードは次のとおりです.
UserクラスがuserNameとpassWordをカプセル化していることを除いて、残りのすべてのコードはActivityに置かれている.これは簡単なMVCモードであるが、肥大化しているように見え、方法の抽出によってlogin()メソッドの論理コードを簡略化することができるが、抽出されたコードはActivityに置かれている.1つのインタフェースに多くの論理機能があれば、対応するメソッド数が多くなり、メンテナンスもやや煩雑になる.
Activity上記機能では、論理機能コードとインタフェース表示コードからなり、一部を抽出して別の処理を行えばActivityを痩せることができます.Cを拡張し,ビジネスロジックを抽出し,MVP(Model-View-presenter)モードを生成し,インタフェースに抽出を表示し,MVVM(Model-View-ViewModel)モードを生成した.
二、MVP
Viewはユーザーのインタラクティブな要求を受け入れて、要求をPresenterに渡して、PresenterはModelを操作してデータの更新を行って、データの更新の後で、ModelはPresenterのデータが変化することを通知して、PresenterはViewのデータを更新します
まずクラスLoginPresenterを書き、ビジネスロジックコードを抽出して処理し、インタフェースに表示されるコードをActivityに残します.では、ログインが成功したかどうかの論理はActivityにメソッドを書いて呼び出す必要があります.では、LoginPresenterでLoginActivityのコードを呼び出す必要があります.LoginActivityのオブジェクトに転送すると、この問題を解決できます.そこで、構造関数LoginPresenter(LoginActivity activity)を作成してLoginActivityオブジェクトに転送し、次のコードを生成します.
LoginActivityでは、ログイン成功と失敗のインタフェース処理コードを次のように書きます.
LoginActivityでは、LoginPresenterクラスのオブジェクトを1つ作成するだけでdoLoginメソッドを呼び出すことができます.
このとき、一つの問題を考えて、使うクラスがFragmentなら?それとも他のクラスですか?明らかに、この方法には限界があり、良い方法は、LoginActivityのオブジェクトを入力するのではなく、インタフェースオブジェクトの入力を定義し、LoginActivityによってインタフェースを実現し、両者の解結合を実現することである.Presenterの機能を処理する必要があるクラスについても、このインタフェースを実装すればよい.インタフェースクラスの定義LoginInterfaceは次のとおりです.
上記のLoginPresenterクラスコードのLoginActivityをLoginInterfaceに変更し、このインタフェースをLoginActivityで実現し、対応する結果インタフェース表示を2つの実装方法で処理する.これによりMVPモードのログイン機能が実現した.
三、MVVM
ActivityにおけるViewに関するコードを抽出することがMVVMモードである.
1. DataBinding
VとViewModle間の通信を実現するため、2015年GoogleのI/O大会でDataBinding技術サポートを発表し、現在API 7およびGradle 1をサポートしている.5.0以上.
使用上は簡単で、moduleのgradleファイルのandroid{}でのみ構成されます.
コードインプリメンテーションは具体的にはログイン例を参照して、プロジェクトをMVVMに変更し続けます.
2.MVVMの実現
まず、ActivityのViewに関連するコード、すなわちsetContentView()メソッドとfindView()のコードを削除します.onCreat()メソッドにbindingコードを追加します.以下のようにします.
layoutレイアウトでは、元のレイアウトルートノードにノードを追加し、ノードを追加してバインドします.次のようになります.
このとき、ActivityのonCreateコードにデータバインドを追加すると、次のようになります.
これにより,View部分のコードロジックをすべて抽出し,MVVMモードを形成する.
四、結びの言葉
以上、MVC、MVP、MVVMのAndroidへの応用について簡単に紹介しただけで、実際のプロジェクトでは、プロジェクト構造をより簡潔に分割し、デカップリングすることができ、具体的な機能は機会を見て行動すればよい.
一、MVC
Androidプロジェクトに着手して、初心者はすべてActivityを作成することを知っていて、それから1つのインタフェースを生んで、HelloWorldの旅を開きます.
このようなモードが存在するため、プロジェクトは自然にMVCモードを呈し、Model-View-Controller、layoutはレイアウトファイルとしてビューViewの役割を果たし、Activityは巨大なControllerとして、MとVを制御し、Viewはインタラクティブな要求を受け入れ、Controllerに要求を渡し、ControllerはModelを操作してデータ更新を行い、データ更新後、ModelはViewデータの変化を通知し、これにより、更新後のデータがViewに表示されます.
簡単な例:ログイン機能.
2つの入力ボックスEditTextとボタンButtonがあり、ユーザー名パスワードを入力してログインするLoginActivityを作成します.ログイン機能コードは次のとおりです.
public void login(View view){
String userName=et_username.getText().toString();
String passWord=et_password.getText().toString();
final User user=new User(userName,passWord);
doLogin(user);
}
private void doLogin(final User user){
new Thread(){
@Override
public void run() {
super.run();
//
booleanlogin=checkUserInfo(user);
if (login) {
runOnUiThread(newRunnable() {
@Override
public void run() {
Toast.makeText(LoginActivity.this," ",Toast.LENGTH_SHORT).show();
}
});
}else {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(LoginActivity.this," ",Toast.LENGTH_SHORT).show();
}
});
}
}
}.start();
}
UserクラスがuserNameとpassWordをカプセル化していることを除いて、残りのすべてのコードはActivityに置かれている.これは簡単なMVCモードであるが、肥大化しているように見え、方法の抽出によってlogin()メソッドの論理コードを簡略化することができるが、抽出されたコードはActivityに置かれている.1つのインタフェースに多くの論理機能があれば、対応するメソッド数が多くなり、メンテナンスもやや煩雑になる.
Activity上記機能では、論理機能コードとインタフェース表示コードからなり、一部を抽出して別の処理を行えばActivityを痩せることができます.Cを拡張し,ビジネスロジックを抽出し,MVP(Model-View-presenter)モードを生成し,インタフェースに抽出を表示し,MVVM(Model-View-ViewModel)モードを生成した.
二、MVP
Viewはユーザーのインタラクティブな要求を受け入れて、要求をPresenterに渡して、PresenterはModelを操作してデータの更新を行って、データの更新の後で、ModelはPresenterのデータが変化することを通知して、PresenterはViewのデータを更新します
まずクラスLoginPresenterを書き、ビジネスロジックコードを抽出して処理し、インタフェースに表示されるコードをActivityに残します.では、ログインが成功したかどうかの論理はActivityにメソッドを書いて呼び出す必要があります.では、LoginPresenterでLoginActivityのコードを呼び出す必要があります.LoginActivityのオブジェクトに転送すると、この問題を解決できます.そこで、構造関数LoginPresenter(LoginActivity activity)を作成してLoginActivityオブジェクトに転送し、次のコードを生成します.
public classLoginPresenter {
private LoginActivity activity;
public LoginPresenter(LoginActivityactivity){
this.activity=activity;
}
private void doLogin(final User user){
new Thread(){
@Override
public void run() {
super.run();
//
booleanlogin=checkUserInfo(user);
if (login) {
activity.loginSuccess();
}else {
activity.loginFailure();
}
}
}.start();
}
private boolean checkUserInfo(User user){
//
return ...;
}
}
LoginActivityでは、ログイン成功と失敗のインタフェース処理コードを次のように書きます.
public void loginSuccess() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(LoginActivity.this," ",Toast.LENGTH_SHORT).show();
}
});
}
public void loginFailure() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(LoginActivity.this," ",Toast.LENGTH_SHORT).show();
}
});
}
LoginActivityでは、LoginPresenterクラスのオブジェクトを1つ作成するだけでdoLoginメソッドを呼び出すことができます.
このとき、一つの問題を考えて、使うクラスがFragmentなら?それとも他のクラスですか?明らかに、この方法には限界があり、良い方法は、LoginActivityのオブジェクトを入力するのではなく、インタフェースオブジェクトの入力を定義し、LoginActivityによってインタフェースを実現し、両者の解結合を実現することである.Presenterの機能を処理する必要があるクラスについても、このインタフェースを実装すればよい.インタフェースクラスの定義LoginInterfaceは次のとおりです.
public interface LoginInterface {
void onLoginSuccess();
void onLoginFailure();
}
上記のLoginPresenterクラスコードのLoginActivityをLoginInterfaceに変更し、このインタフェースをLoginActivityで実現し、対応する結果インタフェース表示を2つの実装方法で処理する.これによりMVPモードのログイン機能が実現した.
三、MVVM
ActivityにおけるViewに関するコードを抽出することがMVVMモードである.
1. DataBinding
VとViewModle間の通信を実現するため、2015年GoogleのI/O大会でDataBinding技術サポートを発表し、現在API 7およびGradle 1をサポートしている.5.0以上.
使用上は簡単で、moduleのgradleファイルのandroid{}でのみ構成されます.
dataBinding{
enabled true
}
コードインプリメンテーションは具体的にはログイン例を参照して、プロジェクトをMVVMに変更し続けます.
2.MVVMの実現
まず、ActivityのViewに関連するコード、すなわちsetContentView()メソッドとfindView()のコードを削除します.onCreat()メソッドにbindingコードを追加します.以下のようにします.
@Override
protected void onCreate(@Nullable BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
ActivityLoginBinding binding=DataBindingUtil.setContentView(this,R.layout.activity_login);
}
layoutレイアウトでは、元のレイアウトルートノードにノードを追加し、ノードを追加してバインドします.次のようになります.
布局中的data即是对数据的绑定,将EditText中的数据显示与User中的数据绑定,而EditText数据变化时需要改变User中的值,因而添加TextWatcher。在此创建了一个UserEvent类,创建两个TextWatcher分别监听EditText变化,来改变User的值,实现ViewModle的功能。UserEvent代码如下:
public class UserEvent {
private User user;
public UserEvent(Useruser){
this.user=user;
}
public TextWatchernameWatcher=new TextWatcher() {
@Override
public voidbeforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public voidonTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public voidafterTextChanged(Editable s) {
user.setUserName(s.toString());
}
};
public TextWatcherpassWordWatcher=new TextWatcher() {
@Override
public voidbeforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public voidonTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public voidafterTextChanged(Editable s) {
user.setPassword(s.toString());
}
};
}
このとき、ActivityのonCreateコードにデータバインドを追加すると、次のようになります.
user=new User();
UserEvent event=newUserEvent(user);
binding.setEvent(event);
これにより,View部分のコードロジックをすべて抽出し,MVVMモードを形成する.
四、結びの言葉
以上、MVC、MVP、MVVMのAndroidへの応用について簡単に紹介しただけで、実際のプロジェクトでは、プロジェクト構造をより簡潔に分割し、デカップリングすることができ、具体的な機能は機会を見て行動すればよい.