博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android MVP 设计模式
阅读量:5234 次
发布时间:2019-06-14

本文共 3008 字,大约阅读时间需要 10 分钟。

为什么需要MVP

关于什么是MVP,以及MVC、MVP、MVVM有什么区别,这类问题网上已经有很多的讲解,你可以自行搜索或看看文末的参考文章,这里就只讲讲为什么需要MVP。 

在开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,并接受并处理来自用户的操作请求,进而作出响应。但是,随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致很容易变得庞大而臃肿。 
越小的类,bug越不容易出现,越容易调试,更容易,我相信这一点大家是都赞同的。在MVP模式下,View和Model是完全分离没有任何直接关联的(比如你在View层中完全不需要导Model的包,也不应该去关联它们)。 
使用MVP模式能够更方便的帮助Activity(或Fragment)职责分离,减小类体积,使项目结构更加清晰。

和MVP到底有什么区别呢?

 这里写图片描述

 

 

从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。

AndroidMVP使用示例

首先需要定义一个View层接口,让View实现类Activity(Fragment)实现; 

其次需要定义一个Presenter实现接口,让Presenter实现类实现; 
在View实现类Activity(Fragment)中包含Presenter对象,并在Presenter创建的时候传一个View对象;
在Presenter中通过构造时传入的视图层对象操作View

从M开始

UserModel.Class

public class UserModel {    public ILoginPresenter mILoginPresenter;    public UserModel(ILoginPresenter presenter) {        this.mILoginPresenter = presenter;    }        public void getServerLogon(String username, String password){        int state=0;        mILoginPresenter.responeLogin(state);    }}

接下来是V

ILoginView.Class

public interface ILoginView {     void loginSuccess(int state);}

LoginActivity.Class

public class LoginActivity extends AppCompatActivity implements ILoginView, View.OnClickListener {    private EditText usernameEdit, passwrodEdit;    private Button loginButton;    private LoginPersenter loginPresenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_mvplogin);        usernameEdit = (EditText) findViewById(R.id.et_username);        passwrodEdit = (EditText) findViewById(R.id.et_username);        loginButton = (Button) findViewById(R.id.bt_login);        loginButton.setOnClickListener(this);        loginPresenter = new LoginPersenter(this);    }    @Override    public void loginSuccess(int state) {        Toast.makeText(this, "login success", Toast.LENGTH_SHORT).show();    }    @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.bt_login:            loginPresenter.requestLogin(usernameEdit.getText().toString(), passwrodEdit.getText().toString()); break; } } }

最后就是P了

ILoginPresenter.Class

public interface ILoginPresenter {     void responeLogin(int state);}

LoginPresenter.Class

public class LoginPersenter implements ILoginPresenter {    public UserModel mUserModel;    public ILoginView mILoginView;    public LoginPersenter(ILoginView view) {        mILoginView=view;        mUserModel = new UserModel(this);    }    public void requestLogin(String username, String password){        mUserModel.getServerLogon(username,password);    }        @Override    public void responeLogin(int state) {        mILoginView.loginSuccess(state);    }}

Android MVP存在的问题

1.在实际开发当中,由于团队之间很难做到密切配合,所以view往往是很难服用的。不用强求复用View

2. 例如当应用进入后台且内存不足的时候,系统是会回收这个Activity的。通常我们都知道要用OnSaveInstanceState()去保存状态,用OnRestoreInstanceState()去恢复状态。 在生命周期处理好Persenter的相关判断。

3.Persenter不参与Android生命周期处理起来会简单一些。

转载于:https://www.cnblogs.com/chenxibobo/p/6544227.html

你可能感兴趣的文章
jquery.md5
查看>>
Python---协程---重写多进程
查看>>
C#获取数组大小
查看>>
python 读 xlsx
查看>>
设计模式C#合集--工厂方法模式
查看>>
IDEA中Git之项目场景
查看>>
java
查看>>
题目1104:整除问题
查看>>
Facebook----扎克伯格
查看>>
mac下破解apk文件以及apktool的相关使用
查看>>
优化网站设计(二十六):设计“智能”的事件处理程序
查看>>
性能测试总结(一)---基础理论篇
查看>>
前端程序员容易忽视的一些基础知识
查看>>
【日常水题-bfs】求细胞数量
查看>>
【noip系列——模拟】 Vigenère 密码
查看>>
windows下一台机器运行多个tomcat
查看>>
flask flask参数 app 配置
查看>>
安装SQL Server提示“等待数据库引擎恢复句柄失败”
查看>>
【转载】分贝是个什么东西?
查看>>
2015 10月19日 工作计划与执行
查看>>