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
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
负责完成View
于Model
间的交互 下面两幅图通过数据与视图之间的交互清楚地展示了这种变化:MVC
模式下实际上就是Activty
与Model之间交互,View完全独立出来了。MVP
模式通过Presenter
实现数据和视图之间的交互,简化了Activity
的职责。同时 即避免了View
和Mode
l的直接联系,又通过Presenter
实现两者之间的沟通。
总结: MVP
模式减少了Activity
的职责,简化了Activity
中的代码,将复杂的逻辑代 码提取到了Presenter
中进行处理,模块职责划分明显,层次清晰。与之对应的好 处就是,耦合度更低,更方便的进行测试。
MVC
和MVP
的区别
MVC
中是允许Model
和View
进行交互的,而MVP
中很明显,Model
与View
之间的 交互由Presenter
完成。还有一点就是Presenter
与View
之间的交互是通过接口 的。
还有一点注意: MVC
中V对应的是布局文件,MVP
中V对应的是Activity
。
二、MVP的简单使用
大多数MVP
模式的示例都使用登录案例进行介绍。因为简单方便,同时能提现出 MVP
的特点。今天我们也以此例进行学习。 使用MVP
的好处之一就是模块职责划 分明显,层次清晰。 该例的结构图即可展现此优点。
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);
}
其中OnLoginFinishedListener
是presenter
层的接口,方便实现回调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
是用作Model
和View
之间交互的桥梁。 从上图的包结构图中可以看出, 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
层。
示例展示:
三、总结
MVP模式的整个核心流程:
View
And Model
it does not interact directly, but rather Presenter
as View
the Model
bridge between. Wherein Presenter
simultaneously hold View
layer Interface
of the references, and Model
a reference layer, and the View
layer holding Presenter
layer reference. When a View layer interface needs to show some data when the first calls the Presenter
reference layer, then the Presenter
layer will call Model
layer request data, when Model
after layer data is loaded successfully calls the Presenter
callback method layer notify Presenter
layer data is loaded, the last Presenter
layer again call View
the interface layer of the data is loaded to the user.
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)