MVP模型一般要创建三个文件夹:View、Interactor(Model)、Presenter

每个部分都有其接口和实现类,就是为了方便回调

这里做一个登陆界面为例子:

接口:

InteractorInterface:
public interface LoginInteractor {
void login(String userName,String password,OnLoginFinishedListener listener);
}
PresenterInterface
public interface LoginPresenter {
void validateCredentials(String userName,String password);
void onDestroy();
}
public interface OnLoginFinishedListener {
void onUserNameError();
void onPasswordError();
void onSuccess();
}
ViewInterface
public interface LoginView {
void setUserNameError();
void setPasswordError();
void navigateToHome();
}

实现类:

InteractorImpl
public class LoginInteractorImpl implements LoginInteractor {
@Override
public void login(final String userName, final String password, final OnLoginFinishedListener listener) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Log.i("ZhiXueHui", "LoginInteractorImpl-login");
boolean error = false;
if(TextUtils.isEmpty(userName)){
listener.onUserNameError();
error = true;
}
if(TextUtils.isEmpty(password)){
listener.onPasswordError();
error = true;
}
if(!error){
listener.onSuccess();
}
}
},2000);
}
}
PresenterImpl
public class LoginPresenterImpl implements LoginPresenter,OnLoginFinishedListener {
private LoginView loginView;
private LoginInteractor loginInteractor; public LoginPresenterImpl(LoginView loginView){
this.loginView = loginView;
this.loginInteractor = new LoginInteractorImpl();
} @Override
public void validateCredentials(String userName, String password) {
Log.i("ZhiXueHui", "LoginPresenterImpl-validateCredentials");
loginInteractor.login(userName,password,this);
} @Override
public void onDestroy() {
Log.i("ZhiXueHui", "LoginPresenterImpl-onDestroy");
loginView = null;
} @Override
public void onUserNameError() {
Log.i("ZhiXueHui", "LoginPresenterImpl-onUserNameError");
if(loginView!=null){
loginView.setUserNameError();
}
} @Override
public void onPasswordError() {
Log.i("ZhiXueHui", "LoginPresenterImpl-onPasswordError");
if(loginView!=null){
loginView.setPasswordError();
}
} @Override
public void onSuccess() {
Log.i("ZhiXueHui", "LoginPresenterImpl-onSuccess");
if(loginView!=null){
loginView.navigateToHome();
}
}
}
ViewActivity
public class LoginActivity extends Activity implements LoginView, View.OnClickListener {

    private EditText userName;
private EditText password;
private Button button;
private LoginPresenter presenter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Log.i("ZhiXueHui", "LoginActivity-onCreate");
userName = (EditText) findViewById(R.id.userName);
password = (EditText) findViewById(R.id.password);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(this); presenter = new LoginPresenterImpl(this);
} @Override
public void setUserNameError() {
Log.i("ZhiXueHui", "LoginActivity-setUserNameError");
userName.setError(getString(R.string.username_error));
} @Override
public void setPasswordError() {
Log.i("ZhiXueHui", "LoginActivity-setPasswordError");
password.setError(getString(R.string.password_error));
} @Override
public void navigateToHome() {
Log.i("ZhiXueHui", "LoginActivity-navigateToHome");
startActivity(new Intent(this, MainActivity.class));
finish();
} @Override
public void onClick(View v) {
Log.i("ZhiXueHui", "LoginActivity-onClick");
presenter.validateCredentials(userName.getText().toString(),password.getText().toString());
}
}

流程图:

流程解释:

第一步:View的实现类调用Presenter的接口

第二步:Presenter的实现类调用Model的接口

第三步:Model的实现类回调Presenter的接口

第四步:Presenter的实现类回调View的接口

一个循环下来,正好是View->Presenter->Model->Presenter->View。

其中要注意的是,Presenter作为中转,分别对接View的实现类和Model的实现类,所以必须要建立两个接口

MVP模型的更多相关文章

  1. 【架构】MVP模型

    MVP模型一般要创建三个文件夹:View.Interactor(Model).Presenter 每个部分都有其接口和实现类,就是为了方便回调 这里做一个登陆界面为例子: 接口: Interactor ...

  2. 【UE4】GAMES101 图形学作业1:mvp 模型、视图、投影变换

    总览 到目前为止,我们已经学习了如何使用矩阵变换来排列二维或三维空间中的对象.所以现在是时候通过实现一些简单的变换矩阵来获得一些实际经验了.在接下来的三次作业中,我们将要求你去模拟一个基于CPU 的光 ...

  3. MVC、MVP、MVVM模型

    在学习vue.react的过程中,总能看到MVVM模型,那么MVVM究竟是什么,下面将我最近看到的资料以及自己的想法总结一下. 与MVVM相似的,还有MVC.MVP,先从MVC.MVP这两个入手,方面 ...

  4. android 学习mvc 和 mvp 和 mvvm参考项目

    githup地址:https://github.com/ivacf/archi 阿尔奇 此存储库展示并比较可用于构建Android应用程序的不同架构模式.完全相同的示例应用程序使用以下方法构建三次: ...

  5. 让我们彻底看清MVC、MVP

    这里開始记录下来自己对MVC.MVP.MVVM这三种框架模式的理解,本文从以下几个方面来梳理. 架构的目的 框架模式.设计模式 MVC设计的介绍 MVC在Android中的应用 MVC该怎样设计 MV ...

  6. Android MVC MVP MVVM (二)

    MVP模型 View主要是Activity,Fragment MVP和MVC的差别 1.Model和View不再直接通信,通过中间层Presenter来实现. 2.Activity的功能被简化,不再充 ...

  7. Android 设计模式对比

    引言: Android框架的发展的过程就是一个不断化繁为简的过程,大家都在研究如何正确方便高效的规范代码.当然这条路也永远不会停止,就像新的芽儿,随着时间的流逝,每天都在长出新的枝叶,每天都在成长.对 ...

  8. 5大JavaScript前端框架简介

    译者按: 简要介绍五大前端框架特性 原文: Top 5 JavaScript Frameworks 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用 ...

  9. 为什么说LAXCUS颠覆了我的大数据使用体验

    切入正题前,先做个自我介绍. 本人是从业三年的大数据小码农一枚,在帝都一家有点名气的广告公司工作,同时兼着大数据管理员的职责. 平时主要的工作是配合业务部门,做各种广告大数据计算分析工作,然后制成各种 ...

随机推荐

  1. What is an intuitive explanation of the relation between PCA and SVD?

    What is an intuitive explanation of the relation between PCA and SVD? 36 FOLLOWERS Last asked: 30 Se ...

  2. angularJS $watch $apply $digest

    看O'Reilly的书看到$watch这部分,不过没看懂,网上很多资料也含糊不清,不过还是找到了几个好的,简单记录一下. 一句话说明,$watch是用来监视变量的,好了直接上代码 <html&g ...

  3. linux netstat查看服务和端口状态

    netstat可以查看linux系统中正在使用的服务和端口情况 常见参数 -a (all)显示所有选项,默认不显示LISTEN相关-t (tcp)仅显示tcp相关选项-u (udp)仅显示udp相关选 ...

  4. Sparse AutoEncoder简介

    1. AutoEncoder AutoEncoder是一种特殊的三层神经网络, 其输出等于输入:\(y^{(i)}=x^{(i)}\), 如下图所示: 亦即AutoEncoder想学到的函数为\(f_ ...

  5. C语言入门教程-(3)基本数据类型

    1.数据类型 在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统.C语言数据类型可以分为四种: 1.基本类型:它们是算术类型,包括两种类型:整数类型和浮点类型. 2.枚举类型:它们 ...

  6. VC++的全局变量(转)

    全局变量一般这样定义:1.在一类的.cpp中定义 int myInt;然后再在要用到的地方的.cpp里extern int myInt:这样就可以用了. 2.在stdafx.cpp中加入:int my ...

  7. 树形dp&&树的重心(D - Godfather POJ - 3107)

    题目链接:https://cn.vjudge.net/contest/277955#problem/D 题目大意:求树的重心(树的重心指的是树上的某一个点,删掉之后形成的多棵树中节点数最大值最小). ...

  8. D - Doing Homework HDU - 1074 (状压dp)

    题目链接:https://cn.vjudge.net/contest/68966#problem/D 具体思路:我们可以把每个情况都枚举出来,然后用递归的形式求出最终的情况. 比如说 我们要求  10 ...

  9. imperva 非交互式导入导出配置

    非交互使用模式full_expimp.sh可以导出/导入手动使用交互式CLI 在root的命令行下执行: 例子:导出:# full_expimp.sh --operation=1 --pwd=密码 - ...

  10. flask基础之app初始化(四)

    前言 flask的核心对象是Flask,它定义了flask框架对于http请求的整个处理逻辑.随着服务器被启动,app被创建并初始化,那么具体的过程是这样的呢? 系列文章 flask基础之安装和使用入 ...