文档章节

MVP

佛系programer
 佛系programer
发布于 2017/01/04 15:46
字数 1082
阅读 38
收藏 2

 MVP模式简介

相信大家对MVC都是比较熟悉了:M-Model-模型、V-View-视图、C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。 从MVC和MVP两者结合来看,Controlller/Presenter在MVC/MVP中都起着逻辑控制处理的角色,起着控制各业务流程的作用。而 MVP与MVC最不同的一点是M与V是不直接关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Presenter层,其负责调控 View与Model之间的间接交互。在 Android中很重要的一点就是对UI的操作基本上需要异步进行也就是在MainThread中才能操作UI,所以对View与Model的切断分离是 合理的。此外Presenter与View、Model的交互使用接口定义交互操作可以进一步达到松耦合也可以通过接口更加方便地进行单元测试。

 MVP模式的应用

1.model层描述和具体代码

提供我们想要展示在view层的数据和具体登陆业务逻辑处理的实现,

/** 
 * 模拟登陆的操作的接口,实现类为LoginModelImpl.相当于MVP模式中的Model层 */ 
public interface LoginModel {
 void login(String username, String password, OnLoginFinishedListener listener);
}

/**
 * 延时模拟登陆(2s),如果名字或者密码为空则登陆失败,否则登陆成功 */
 public class LoginModelImpl implements LoginModel {
        @Override
        public void login(final String username, final String password, final OnLoginFinishedListener listener) {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    boolean error = false;
                    if (TextUtils.isEmpty(username)) {
                        listener.onUsernameError();
                        //model层里面回调listener error = true; 
                    }
                    if (TextUtils.isEmpty(password)) {
                        listener.onPasswordError();
                        error = true;
                    }
                    if (!error) {
                        listener.onSuccess();
                    }
                }
            }, 2000);
        }
    }

2. view层描述和具体代码

负责显示数据、提供友好界面跟用户交互就行。MVP下Activity和Fragment以及View的子类体现在了这一 层,Activity一般也就做加载UI视图、设置监听再交由Presenter处理的一些工作,所以也就需要持有相应Presenter的引用。本层所需要做的操作就是在每一次有相应交互的时候,调用presenter的相关方法就行。(比如说,button点击)

/**
 *登陆View的接口,实现类也就是登陆的activity
 */
public interface LoginView {
    void showProgress();

    void hideProgress();

    void setUsernameError();

    void setPasswordError();

    void navigateToHome();
}
public class LoginActivity extends Activity 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 = new LoginPresenterImpl(this);
    }

    @Override
    protected void onDestroy() {
        presenter.onDestroy();
        super.onDestroy();
    }

    @Override
    public void showProgress() {
        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    public void hideProgress() {
        progressBar.setVisibility(View.GONE);
    }

    @Override
    public void setUsernameError() {
        username.setError(getString(R.string.username_error));
    }

    @Override
    public void setPasswordError() {
        password.setError(getString(R.string.password_error));
    }

    @Override
    public void navigateToHome() {
        TODO startActivity (new Intent(this, MainActivity.class));
        Toast.makeText(this, "login success", Toast.LENGTH_SHORT).show();
        finish();
    }

    @Override
    public void onClick(View v) {
        presenter.validateCredentials(username.getText().toString(), password.getText().toString());
    }
}

3. presenter层描述和具体代码

Presenter扮演着view和model的中间层的角色。获取model层的数据之后构建view层;也可以收到view层UI上的反馈命令后分发处理逻辑,交给model层做业务操作。它也可以决定View层的各种操作。

public interface LoginPresenter {
    void validateCredentials(String username, String password);

    void onDestroy();
}

 

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

    public LoginPresenterImpl(LoginView loginView) {
        this.loginView = loginView;
        this.loginModel = new LoginModelImpl();
    }

    @Override
    public void validateCredentials(String username, String password) {
        if (loginView != null) {
            loginView.showProgress();
        }
        loginModel.login(username, password, this);
    }

    @Override
    public void onDestroy() {
        loginView = null;
    }

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

    @Override
    public void onPasswordError() {
        if (loginView != null) {
            loginView.setPasswordError();
            loginView.hideProgress();
        }
    }

    @Override
    public void onSuccess() {
        if (loginView != null) {
            loginView.navigateToHome();
        }
    }
}

4. 登陆的回调接口

public interface OnLoginFinishedListener {
    void onUsernameError();

    void onPasswordError();

    void onSuccess();
}

 demo的代码流程:
1 Activity做了一些UI初始化的东西并需要实例化对应LoginPresenter的引用和实现 LoginView的接口,监听界面动作
2 登陆按钮按下后即接收到登陆的事件,在onClick里接收到即通过LoginPresenter的引用把它交给LoginPresenter处理。LoginPresenter接收到了登陆的逻辑就知道要登陆了
3 然后LoginPresenter显示进度条并且把逻辑交给我们的Model去处理,也就是这里面的LoginModel,(LoginModel的实现类LoginModelImpl),同时会把OnLoginFinishedListener也就是LoginPresenter自身传递给我们的Model(LoginModel)。
4 LoginModel处理完逻辑之后,结果通过OnLoginFinishedListener回调通知LoginPresenter
5 LoginPresenter再把结果返回给view层的Activity,最后activity显示结果

请直接参考文章,这里面有很多的mvp模式的学习资料:

android架构合集

本文转载自:http://wetest.qq.com/lab/view/85.html

上一篇: 炫酷的loading框
下一篇: 事件分发机制
佛系programer
粉丝 2
博文 29
码字总数 19941
作品 0
珠海
程序员
私信 提问
Android 官方 MVP 架构示例--Android 架构蓝图

Google 推出的一个项目,专门展示 Android 引用各种各样的 MVP 架构。 目前已经完成的示例有 todo-mvp(mvp 基础架构示例) todo-mvp-loaders(基于 mvp 基础架构项目,获取数据部分使用了 ...

匿名
2017/01/11
915
0
百位云计算专家齐聚湖畔大学,阿里云MVP全球闭门会聚焦数字化转型

“阿里云MVP是中国互联网的力量,是中国技术变革、经济变革的力量。”9月18日,阿里云MVP全球闭门会现场,阿里云总裁胡晓明的话引发了会议现场热烈的掌声。 小桥流水、小亭古乐,阿里云MVP全...

仙游
2018/09/25
0
0
阿里云MVP(最有价值专家)招募

阿里云MVP(Most Valuable Professional,最有价值专家)第六期全球招募开始了! 面向全球开发者,寻找热爱技术、乐于分享的你! 什么是阿里云 MVP? 阿里云MVP(Most Valuable Professional,最...

alirobin
2018/08/14
213
0
Android MVP模式开发

一.什么是MVP MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。  模型(Model):负责处理数据的加载或者存储,比如从网络或本地数据库获取数...

SRain215
2016/04/06
162
0
MVP 社区巡讲,深圳站、广站州

MVP社区巡讲 20160409 深圳站 《MVP Program Introduction》 MVP舒永春 主题一:《微软智能云Azure:为电子商务创造无限可能》 MVP舒永春 主题二:《基于Azure多层应用基础架构》 MVP马伟 主...

jimshu
2016/04/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CQRS与AXON

CQRS 看了蛮多文章,只会CRUD,却不懂CQRS,CQRS是遵循DDD思想而产生的一种模式,Command and Query Responsibility Segregation 命令与查询隔离。查询就直接通过正常的模式service调dao层。...

无极之岚
35分钟前
4
0
OSChina 周三乱弹 —— 欢迎你来做产品经理

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :10多次劲歌金曲获奖,更多叱咤歌坛排名,黎明才应该是四大天王之首,只可惜拍的电影太少。单曲循环一个多月的歌,力荐 《无名份的...

小小编辑
50分钟前
99
7
500行代码,教你用python写个微信飞机大战

这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。 帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!...

上海小胖
今天
8
0
关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部