安卓MVP模式

一、MVP概念

M : Model(负责存储、检索、操纵数据)
V : View(负责绘制UI元素,与用户进行交互)
P : Presenter (是连接Model 和 View 的桥梁)

二、MVP的作用

  1. 将视图逻辑和业务逻辑分离开来,降低耦合度
  2. Activity只处理生命周期的任务
  3. 提高代码的阅读性
  4. Presenter被抽象成接口,有多种具体的实现方式
    业务逻辑在Presenter中,避免Activity造成内存泄露

三、MVP的核心思想

将Activity中的视图逻辑抽象成View接口,将业务逻辑抽象成Presenter接口

四、MVP的使用

根据谷歌官方的mvp写法,以下将用一个用户登录的demo来讲解。
github地址:https://github.com/jwllls/MVPDemo.git
步骤如下:

  1. 创建BaseView,BasePresenter
  2. 创建LoginContract(创建View 和 presenter,在其中声明方法 )
  3. 创建LoginPresenter(继承Contract 中的 Presenter,具体实现其中的方法)
  4. 创建LoginModel(具体实现数据逻辑,如请求网络数据,数据库中的数据等)

五、Demo代码说明

项目架构

mvp


BaseView

public interface BaseView<T> {

    void setPresenter(T presenter);  //该方法用于绑定View

}

BasePresenter

public interface BasePresenter {

    void onStart(); //用来进行初始化工作
}

LoginContract

public class LoginContract {

    public interface View extends BaseView<Presenter> {
        //这里可以定义与 View 相关的方法

        void showLoading();  // 显示加载

        void dismissLoading();  // 隐藏加载

        void toastSucMsg(); // 提示登录成功消息

        void toastFailMsg();// 提示登录失败

    }
    public interface Presenter extends BasePresenter {
        // 这里可以定义逻辑相关的方法,如请求网络数据或本地数据库的数据等。

        void userLogin(String username, String password); // 定义一个登录方法, 模拟用户请求网络数据进行登录

    }

}

LoginModel

在Model中进行具体的数据操作,如请求网络数据或请求数据库的数据等等。

public class LoginModel {
    /**
     * 在这定义一个获取用户对象的方法
     */
    public User getUser() {

        //假设从服务器上获取到的对象是User,用户名和密码分别是admin和12345

        User user = new User();

        user.setUsername("admin");
        user.setPassword("12345");

        return user;

    }
}

LoginPresenter

public class LoginPresenter implements LoginContract.Presenter {

    private LoginContract.View view;
    private UserModel model;   //用于数据的处理,如网络请求、数据库请求等
    private Activity activity;

    public LoginPresenter(LoginContract.View view, Activity activity) {
        this.view = view;
        this.activity = activity;
        view.setPresenter(this);  //在构造方法中将 Presenter 和 View 绑定
        model = new UserModel();  //创建UserModel对象
    }

    @Override
    public void onStart() {
        // userLogin  可以在onStar( )进行初始化方法
    }

    @Override
    public void userLogin(String username, String password) {

        User user = model.getUserModel();   //模拟获得网络请求返回的用户数据

        view.showLoading();  //显示加载窗

        if (user.getUsername().equals(username) && user.getPassword().equals(password)) {  //加入账号密码正确则登录成功

            new Handler().postDelayed(new Runnable() {  //延迟2秒后执行
                @Override
                public void run() {
                    view.toastSucMsg();     //登录成功提示消息
                    view.dismissLoading();  //关闭加载窗
                    activity.startActivity(new Intent(activity, MainActivity.class));  //跳转到主界面
                }
            }, 2000); 

        } else {

            new Handler().postDelayed(new Runnable() { //延迟1秒后执行
                @Override
                public void run() {
                    view.toastFailMsg();    //登录失败提示消息
                    view.dismissLoading(); //关闭加载窗
                }
            }, 1000);

        }
    }
}

六、总结

以上代码简单地实现了一个用户登陆的mvp模式,这种模式能够将我们的代码充分解耦,能够很好地对代码进行维护和扩展。但是有些时候我们的需求是一些比较简单的业务逻辑和界面,这时候也可以结合mvc的方式来加快我们的开发速度,因为如果每个界面都要创建Presenter、View的话,会让代码比较臃肿。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值