As someone who has, for some Android MVP mode Detailed

Foreword

Nothing else to do at home before finishing accidentally turn the documents and interview preparation to do the route, although the content a bit more, but the technology does not push the body, the more the better

This section summarizes some knowledge about Android is advanced, involving knowledge points more complex, but are almost always asked in the interview knowledge, but also add some points. In this part, you may need to have some specific projects practice. In the interview process, combined with the specific practice their own experience to more in-depth and thorough portrayed
As someone who has, for some Android MVP mode Detailed

GitHub follow-up related content update, I want to impact gold and three silver four small partners can look and see, welcome Star
( pulled left GitHub link, you need access to relevant content such as interviews can find their own )
https://github.com/xiangjiana/Android-MS
(VX:mm14525201314)

MVP, MVC, MVVM
here extends: the difference between the handwritten mvp example, the MVC, the advantages mvp

MVP 模式,对应着 Model--业务逻辑和实体模型,view--对应着 activity,负责 View 的绘制以 及与用户交互,Presenter--负责 View 和 Model 之间的交互,MVP 模式是在 MVC 模式的基础上, 将 Model 与 View 彻底分离使得项目的耦合性更低,在 Mvc 中项目中的 activity 对应着 mvc 中的 C--Controllor,而项目中的逻辑处理都是在这个 C 中处理,同时 View 与 Model 之间的交 互,也是也就是说,mvc 中所有的逻辑交互和用户交互,都是放在 Controllor 中,也就是 activity 中。View 和 model 是可以直接通信的。而 MVP 模式则是分离的更加彻底,分工更加明确 Model--业务逻辑和实体模型,view--负责与用户交互,Presenter 负责完成 View 于 Model 间的交互,MVP 和 MVC 最大的区别是 MVC中是允许 Model 和 View 进行交互的,而 MVP 中很明显,Model 与 View 之间的交互由 Presenter 完成。还有一点就是 Presenter 与 View 之 间的交互是通过接口的

一、MVP概述

MVP,全称 Model-View-Presenter 即模型-视图-层现器。
提到MVP,就必须要先介绍一下它的前辈MVC,因为MVP正是基于MVC的基础发 展而来的。两个之间的关系也是源远流长。
MVC,全称Model-View-Controller,即模型-视图-控制器。 具体如下:
View 对应于布局文件
Model 业务逻辑和实体模型
Controllor 对应于Activity

但是View对应于布局文件,其实能做的事情特别少,实际上关于该布局文件中的数 据绑定的操作,事件处理的代码都在Activity中,造成了Activity既像View又像 Controller,使得Activity变得臃肿。

而当将架构改为MVP以后,Presenter的出现,将Actvity视为View层,Presenter负 责完成View层与Model层的交互。

现在是这样的: View对应于Activity,负责View的绘制以及与用户交互 Model 依然是业务逻辑和实体模型 Presenter 负责完成ViewModel间的交互 下面两幅图通过数据与视图之间的交互清楚地展示了这种变化:
As someone who has, for some Android MVP mode Detailed
MVC模式下实际上就是Activty与Model之间交互,View完全独立出来了。
As someone who has, for some Android MVP mode Detailed
MVP模式通过Presenter实现数据和视图之间的交互,简化了Activity的职责。同时 即避免了ViewModel的直接联系,又通过Presenter实现两者之间的沟通。

总结: MVP模式减少了Activity的职责,简化了Activity中的代码,将复杂的逻辑代 码提取到了Presenter中进行处理,模块职责划分明显,层次清晰。与之对应的好 处就是,耦合度更低,更方便的进行测试。

MVCMVP的区别

As someone who has, for some Android MVP mode Detailed
MVC中是允许ModelView进行交互的,而MVP中很明显,ModelView之间的 交互由Presenter完成。还有一点就是PresenterView之间的交互是通过接口 的。

还有一点注意: MVC中V对应的是布局文件,MVP中V对应的是Activity

二、MVP的简单使用

大多数MVP模式的示例都使用登录案例进行介绍。因为简单方便,同时能提现出 MVP的特点。今天我们也以此例进行学习。 使用MVP的好处之一就是模块职责划 分明显,层次清晰。 该例的结构图即可展现此优点。
As someone who has, for some Android MVP mode Detailed

1.Model层

在本例中,M0del层负责对从登录页面获取地帐号密码进行验证(一般需要请求服 务器进行验证,本例直接模拟这一过程)。 从上图的包结构图中可以看出,Model 层包含内容:

①实体类bean
②接口,表示Model层所要执行的业务逻辑
③接口实现类,具体实现业务逻辑,包含的一些主要方法

下面以代码的形式一一展开。
①实体类bean

   public class User { 
      private String password; 
      private String username; 

      public String getPassword() { 
          return password; 
      }

      public void setPassword(String password) { 
          this.password = password; 
      }

      public String getUsername() { 
          return username; 
      }
      public void setUsername(String username) { 
          this.username = username; 
      }
      @Override 
      public String toString() { 
         return "User{" + 
                "password='" + password + '\'' + 
                ", username='" + username + '\'' + 
                '}'; 
      }
   }

封装了用户名、密码,方便数据传递。
②接口

  public interface LoginModel { 
      void login(User user, OnLoginFinishedListener listener); 
  }

其中OnLoginFinishedListenerpresenter层的接口,方便实现回调presenter,通知presenter业务逻辑的返回结果,具体在presenter层介绍。
③接口实现类

  public class LoginModelImpl implements LoginModel { 
     @Override 
     public void login(User user, final OnLoginFinishedListener l istener) {
        final String username = user.getUsername(); 
        final String password = user.getPassword(); 
        new Handler().postDelayed(new Runnable() { 
           @Override public void run() { 
              boolean error = false; 
              if (TextUtils.isEmpty(username)){ 
                 listener.onUsernameError();//model层里面回调li stener 
                 error = true;
              }
              if (TextUtils.isEmpty(password)){ 
                 listener.onPasswordError(); 
                 error = true; 
             }
             if (!error){ 
                 listener.onSuccess(); 
             } 
          } 
       }, 2000); 
    }
  }

实现Model层逻辑:延时模拟登陆(2s),如果用户名或者密码为空则登陆失败, 否则登陆成功。

2.View层

视图:Modle层请求的数据呈现给用户。一般的视图都只是包含用户界面(UI),而 不包含界面逻辑,界面逻辑由Presenter来实现。

从上图的包结构图中可以看出,View包含内容:

①接口,上面我们说过Presenter与View交互是通过接口。其中接口中方法的定义是 根据Activity用户交互需要展示的控件确定的。
②接口实现类,将上述定义的接口中的方法在Activity中对应实现具体操作。

下面以代码的形式一一展开。
①接口

  public interface LoginView { 
     //login是个耗时操作,我们需要给用户一个友好的提示,一般就是操作Progre ssBarvoid showProgress(); 
     void hideProgress(); 
    //login当然存在登录成功与失败的处理,失败给出提示 void setUsernameError(); 
     void setPasswordError(); 
    //login成功,也给个提示 
     void showSuccess(); 
  }

上述5个方法都是presenter根据model层返回结果需要view执行的对应的操作。

②接口实现类
即对应的登录的Activity,需要实现LoginView接口。

  public class LoginActivity extends AppCompatActivity implements LoginView, View.OnClickListener { 
     private ProgressBar progressBar; 
     private EditText username; 
     private EditText password; 
     private LoginPresenter presenter; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_login);
       progressBar = (ProgressBar) findViewById(R.id.progress); 
       username = (EditText) findViewById(R.id.username); 
       password = (EditText) findViewById(R.id.password); 
       findViewById(R.id.button).setOnClickListener(this); 
      //创建一个presenter对象,当点击登录按钮时,让presenter去调用mode l层的login()方法,验证帐号密码
       presenter = new LoginPresenterImpl(this); 
    }
    @Override 
    protected void onDestroy() { 
       presenter.onDestroy(); 
       super.onDestroy();
    }
    @Override 
    public void showProgress() { 
       progressBar.setVisibility(View.VISIBLE); 
    }
    .....
  }

View层实现Presenter层需要调用的控件操作,方便Presenter层根据Model层返回 的结果进行操作View层进行对应的显示。

3.Presenter层

Presenter是用作ModelView之间交互的桥梁。 从上图的包结构图中可以看出, Presenter包含内容:

①接口,包含Presenter需要进行Model和View之间交互逻辑的接口,以及上面提到 的Model层数据请求完成后回调的接口。
②接口实现类,即实现具体的Presenter类逻辑。

下面以代码的形式一一展开。
①接口

  public interface OnLoginFinishedListener { 
     void onUsernameError(); 
     void onPasswordError(); 
     void onSuccess(); 
  }

Model层得到请求的结果,需要回调Presenter层,让Presenter层调用View层的 接口方法。

  public interface LoginPresenter { 
     void validateCredentials(User user); 
     void onDestroy(); 
  }

登陆的Presenter 的接口,实现类为LoginPresenterImpl,完成登陆的验证,以及销 毁当前view

②接口实现类

  public class LoginPresenterImpl implements LoginPresenter, OnLog inFinishedListener { 
     private LoginView loginView; 
     private LoginModel loginModel; 

     public LoginPresenterImpl(LoginView loginView) { 
        this.loginView = loginView; 
        this.loginModel = new LoginModelImpl(); 
     }
     @Override 
     public void validateCredentials(User user) { 
        if (loginView != null) { 
            loginView.showProgress();
        }
        loginModel.login(user, this); 

     }
     @Override 
     public void onDestroy() {
        loginView = null; 
     }
     @Override 
     public void onUsernameError() { 
        if (loginView != null) { 
           loginView.setUsernameError();
           ....
   }

由于presenter完成二者的交互,那么肯定需要二者的实现类(通过传入参数,或者 new)。 presenter里面有个OnLoginFinishedListener, 其在Presenter层实现,给Model层 回调,更改View层的状态, 确保 Model层不直接操作View层。

示例展示:
As someone who has, for some Android MVP mode Detailed

三、总结

MVP模式的整个核心流程:

ViewAnd Modelit does not interact directly, but rather Presenteras Viewthe Modelbridge between. Wherein Presentersimultaneously hold Viewlayer Interfaceof the references, and Modela reference layer, and the Viewlayer holding Presenterlayer reference. When a View layer interface needs to show some data when the first calls the Presenterreference layer, then the Presenterlayer will call Modellayer request data, when Modelafter layer data is loaded successfully calls the Presentercallback method layer notify Presenterlayer data is loaded, the last Presenterlayer again call Viewthe interface layer of the data is loaded to the user.
As someone who has, for some Android MVP mode Detailed

GitHub follow-up related content update, I want to impact gold and three silver four small partners can look and see, welcome Star
( pulled left GitHub link, you need access to relevant content such as interviews can find their own )
https://github.com/xiangjiana/Android-MS
(VX:mm14525201314)

Guess you like

Origin blog.51cto.com/14541311/2470693
Recommended