【架构】MVP模型
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模型的更多相关文章
- MVP模型
MVP模型一般要创建三个文件夹:View.Interactor(Model).Presenter 每个部分都有其接口和实现类,就是为了方便回调 这里做一个登陆界面为例子: 接口: Interactor ...
- 【云安全与同态加密_调研分析(6)】云计算及云安全主流体系架构与模型——By Me
云计算及云安全的主流体系架构与模型 1. 云计算主流安全参考模型 1.1 云计算安全参考 ...
- Caffe学习笔记(一):Caffe架构及其模型解析
Caffe学习笔记(一):Caffe架构及其模型解析 写在前面:关于caffe平台如何快速搭建以及如何在caffe上进行训练与预测,请参见前面的文章<caffe平台快速搭建:caffe+wind ...
- 【UE4】GAMES101 图形学作业1:mvp 模型、视图、投影变换
总览 到目前为止,我们已经学习了如何使用矩阵变换来排列二维或三维空间中的对象.所以现在是时候通过实现一些简单的变换矩阵来获得一些实际经验了.在接下来的三次作业中,我们将要求你去模拟一个基于CPU 的光 ...
- EF架构~充血模型设置不被持久化的属性
回到目录 在Poco实体中,一般只有属性没有方法,这在软件设计中称为贫血模型,而在DDD领域驱动设计中,比较提倡充血模型,即你的Poco实体中,即有属性,也有操作属性的方法,注意这里说的是操作属性的方 ...
- EF架构~CodeFirst模型下的数据初始化
回到目录 我为什么会来 在传统的大型系统设计中,数据库建模是个比开发更早的环节,先有数据库,然后是ORM模型,最后才是开发程序,而这种模型在EF出现后发生了转变,而且有可能将来会被code first ...
- qt model/view 架构自定义模型之QFileSystemModel
# -*- coding: utf-8 -*- # python:2.x #QFileSystemModel """ Qt 内置了两种模型:QStandardItemM ...
- qt model/view 架构自定义模型之QStringListModel
# -*- coding: utf-8 -*- # python:2.x #QStringListModel #QStringListModel 是最简单的模型类,具备向视图提供字符串数据的能力. # ...
- 28. ClustrixDB 分布式架构/评估模型
本节描述如何在数据库中计算查询.在ClustrixDB中,我们跨节点切片数据,然后将查询发送到数据.这是数据库的基本原则之一,它允许随着添加更多节点而几乎线性地扩展. 有关如何分布数据的概念,请参阅数 ...
随机推荐
- android打电话的小程序
主要使用了Intent以及uses-permission标签. call.rar 下载后直接导入项目
- Make My GitHub Pages
https://git-scm.com/ https://pages.github.com/ 1.建立repository. 2.settings 3.选模板 4.Publish http://use ...
- SAP SMARTFORM 变量显示技巧
&symbol& (括号中,小写字母为变量) &symbol& 屏蔽从第一位开始的N位&symbol (n)& 只显示前N位&sym ...
- Greedy:Physics Experiment(弹性碰撞模型)(POJ 3848)
物理实验 题目大意:有一个与地面垂直的管子,管口与地面相距H,管子里面有很多弹性球,从t=0时,第一个球从管口求开始下落,然后每1s就会又有球从球当前位置开始下落,球碰到地面原速返回,球与球之间相碰会 ...
- 【hadoop2.6.0】数据丢失问题解决
想自己走一遍从代码到运行的流程,结果各种错,郁闷啊. 问题① http://localhost:50070/ 里面一进去就告诉我块丢了.... 解决: bin/hadoop fsck -delete ...
- CCF 节日
问题描述 有一类节日的日期并不是固定的,而是以"a月的第b个星期c"的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日. 现在,给你a,b,c和y1, y2(1850 ≤ ...
- Json数据报错
在Json数据解析的时候报错,如下图: 这里的id,code,A1等等,都应该使用双引号,即:"id","code","A1",假如id后面 ...
- QtCreator 添加第三方头文件库文件路径
打开工程名.pro文件 添加 INCLUDEPATH += $$PWD/../../Obelisk/thirdparty/prebuilt/include/LeapSDKOrion LIBS += - ...
- [Android Pro] 临时关闭selinux模式 setenforce 0
setenforce 0 设置SELinux 成为permissive模式 临时关闭selinux的
- 开启后台 Service 闪退
04-29 15:36:23.395: E/ActivityThread(15275): Performing stop of activity that is not resumed: {com.e ...