zoukankan      html  css  js  c++  java
  • Android MVP 设计模式*

    为什么需要MVP

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

    MVC和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生命周期处理起来会简单一些。

  • 相关阅读:
    SQL Server调优系列基础篇
    SQL分组查询及聚集函数的使用
    数据库索引
    ASP.NET MVC5入门指南
    AOP 动态织入的.NET实现
    mmap学习
    Mysql的优化一则
    PHP 5.5 新特性
    19个三维GIS软件对比
    周鸿祎区块链五大缺点, 区块链的100个问题
  • 原文地址:https://www.cnblogs.com/chenxibobo/p/6544227.html
Copyright © 2011-2022 走看看