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を作成します.ログイン機能コードは次のとおりです.
   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への応用について簡単に紹介しただけで、実際のプロジェクトでは、プロジェクト構造をより簡潔に分割し、デカップリングすることができ、具体的な機能は機会を見て行動すればよい.