一、理解MVP

原文地址

我的Demo

效果图:

项目结构:

实现

一、Model层

首先定义一个实体类User

package app.qcu.pmit.cn.mvpdemo.model;

/**
 * Created by Administrator on 2018/5/24 0024.
 */

public class User {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

其次就是业务类,抽取了一个接口 IUserBiz,登录界面连接服务器有一个登录方法 Login() ,耗时操作需要开辟子线程,

package app.qcu.pmit.cn.mvpdemo.model;

/**
 * Created by Administrator on 2018/5/24 0024.
 */

public class UserBiz implements IUserBiz {
    @Override
    public void login(final String name, final String pwd, final OnLoginListener listener) {
        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if ("yl".equals(name) && "123456".equals(pwd)) {
                    User user = new User();
                    user.setUsername(name);
                    user.setPassword(pwd);
                    listener.loginSuccess(user);
                } else {
                    listener.loginFaild();
                }
            }
        }.start();
    }
}
package app.qcu.pmit.cn.mvpdemo.model;

/**
 * Created by Administrator on 2018/5/24 0024.
 */

public interface IUserBiz {
    void login(String name, String pwd, OnLoginListener listener);
}

再用一个回调接口来通知登录的状态,成功或者失败

package app.qcu.pmit.cn.mvpdemo.model;

/**
 * Created by Administrator on 2018/5/24 0024.
 */

public interface OnLoginListener {
    void loginSuccess(User user);

    void loginFaild();
}

二、View层

UI的逻辑,抽取一个接口由Activity实现

package demo.example.com.mvp3.view;

/**
 * Created by Administrator on 2018/5/9 0009.
 */

public interface IUserLoginView {
    String getName();

    String getPwd();

    void showLoading();

    void hideLoading();

    void toMainActivity();

    void showFaildError();

    void clearName();

    void clearPwd();
}
package demo.example.com.mvp3.view;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import demo.example.com.mvp3.MainActivity;
import demo.example.com.mvp3.R;
import demo.example.com.mvp3.presenter.UserLoginPresenter;

/**
 * Created by Administrator on 2018/5/9 0009.
 */

public class UserLoginActivity extends AppCompatActivity implements IUserLoginView {

    private EditText etName, etPwd;
    private Button btnLogin, btnClear;
    private ProgressBar pbLogin;

    private UserLoginPresenter userLoginPresenter = new UserLoginPresenter(this);

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        initView();
    }

    private void initView() {
        etName = findViewById(R.id.user_name);
        etPwd = findViewById(R.id.user_pwd);
        btnLogin = findViewById(R.id.btn_login);
        btnClear = findViewById(R.id.btn_clear);
        pbLogin = findViewById(R.id.pb_login);

        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                userLoginPresenter.Login();
            }
        });
        btnClear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                userLoginPresenter.clear();
            }
        });
    }

    @Override
    public String getName() {
        return etName.getText().toString();
    }

    @Override
    public String getPwd() {
        return etPwd.getText().toString();
    }

    @Override
    public void showLoading() {
        pbLogin.setVisibility(View.VISIBLE);
    }

    @Override
    public void hideLoading() {
        pbLogin.setVisibility(View.GONE);
    }

    @Override
    public void toMainActivity() {
        startActivity(new Intent(this, MainActivity.class));
    }

    @Override
    public void showFaildError() {
        Toast.makeText(this, "名字还是密码写错啦!", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void clearName() {
        etName.setText("");
    }

    @Override
    public void clearPwd() {
        etPwd.setText("");
    }
}

三、Presenter层

界面整体的用户交互的功能有两个,“登录”和“清除”,所以Presenter中有两个方法,即 login() 和 clear(),使用view和model中的方法实现

package app.qcu.pmit.cn.mvpdemo.presenter;

import android.os.Handler;

import app.qcu.pmit.cn.mvpdemo.model.IUserBiz;
import app.qcu.pmit.cn.mvpdemo.model.OnLoginListener;
import app.qcu.pmit.cn.mvpdemo.model.User;
import app.qcu.pmit.cn.mvpdemo.model.UserBiz;
import app.qcu.pmit.cn.mvpdemo.view.IUserLoginView;

/**
 * Created by Administrator on 2018/5/24 0024.
 */

public class UserLoginPresenter {
    private IUserBiz userBiz;
    private IUserLoginView userLoginView;
    private Handler mHandler = new Handler();

    public UserLoginPresenter(IUserLoginView userLoginView) {
        this.userLoginView = userLoginView;
        this.userBiz = new UserBiz();
    }

    public void Login() {
        userLoginView.showLoading();
        userBiz.login(userLoginView.getName(), userLoginView.getPwd(), new OnLoginListener() {
            @Override
            public void loginSuccess(User user) {
                //需要在UI线程执行
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        userLoginView.toMainActivity();
                        userLoginView.hideLoading();
                    }
                });
            }

            @Override
            public void loginFaild() {
                //需要在UI线程执行
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        userLoginView.showFaildError();
                        userLoginView.hideLoading();
                    }
                });

            }
        });
    }

    public void clear() {
        userLoginView.clearName();
        userLoginView.clearPwd();
    }
}

二、实际开发MVP(官方模式)

原文地址

我的demo

安卓MVP框架的更多相关文章

  1. 【腾讯Bugly干货分享】一步一步实现Android的MVP框架

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5799d7844bef22a823b3ad44 内容大纲: Android 开发 ...

  2. mvp框架

    本文在于巩固基础 mvp框架的概念: MVP是MVC模式的另一个变种,MVP即可以应用到WEB项目中, 也可以应用到Winform项目中,它的方便的测试机制为大型复杂的企业级应用带来了福音,MVP模式 ...

  3. Android Studio开发快速创建MVP框架插件AndroidMVP

    转载:https://www.jianshu.com/p/60cd98bbc358 Android开发中,我们为了代码的解耦以及后期的维护方便,都会采用一些开发框架,常用的有MVC.MVP.MVVM. ...

  4. 如何实现自己的Android MVP框架?

    相信熟悉android开发的童鞋对MVP框架应该都不陌生吧,网上很多关于android中实现MVP的文章,大家可以直接搜索学习.这些文章中,MVP的实现思路基本都是把Activity.Fragment ...

  5. JavaScript 的 MVP 框架 Riot.js

    Riot.js 详细介绍 Riot.js是一个客户端模型-视图-呈现(MVP)框架并且它非常轻量级甚至小于1kb.尽管他的大小令人难以置信,所有它能构建的有如下:一个模板引擎,路由,甚至是库和一个严格 ...

  6. 玩转OneNET物联网平台之MQTT服务⑤ —— OneNet智能灯+MVP框架

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  7. 移动架构之MVP框架

    MVP是在开发中常用的框架,要了解其原理,先要从了解MVC开始,这里就对MVP框架做一个简单的介绍 MVC MVC为Model,View与Controllor的缩写 Model:业务逻辑和实体模型 V ...

  8. android课程表控件、悬浮窗、Todo应用、MVP框架、Kotlin完整项目源码

    Android精选源码 Android游戏2048 MVP Kotlin项目(RxJava+Rerotfit+OkHttp+Glide) Android基于自定义Span的富文本编辑器 android ...

  9. Android MVP框架模式

    结合前一篇MVC框架模式 为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Mode ...

随机推荐

  1. Filter and servlet

    filter与servlet的区别与联系呢? 1. Filter    实现javax.servlet.Filter接口,在web.xml中配置与标签指定使用哪个Filter实现类过滤哪些URL链接. ...

  2. mybatis(二)--相关属性及相关细节

    mapper接口动态代理 动态代理dao开发规则 1.namespace必需是接口的全路径名 2.接口的方法名 必需与 映射文件的sql id一致 3.接口的输入参数必需与映射文件的parameter ...

  3. Python3学习之路~5.11 configparser模块

    用于生成和修改常见配置文档,当前模块的名称在 python 2.x 版本中为 ConfigParser, python 3.x 版本中变更为 configparser. 来看一个好多软件的常见文档格式 ...

  4. Redis入门到高可用(十四)—— bitmap

    一.初步认识 二.API 1.setbit 2.getbit 3.bitcount 4.bitop 5.bitpos 三.位图使用 四. 使用经验

  5. js篇-判断数组对象中是否含有某个值,并返回该条数据

    项目背景需求是: 已知: var a=[{name:'jenny',age:18},{name:'john',age:19},{name:'jack',age:20}] var b ='jenny' ...

  6. CentOS6.5安装pip

    首先重要的事情说三遍,因为可能有程序依赖目前的python2环境,比如yum: 不要动现有的python2环境! 不要动现有的python2环境! 不要动现有的python2环境! 如果你动了,yum ...

  7. 深入理解Java虚拟机1-chap1-2-斗之气8段

    1.HotSpot VM:热点代码探测能力,与JIT技术共同进行编译优化,输出高质量代码 2.运行时数据区域 程序计数器:控制程序执行顺序,无OOM Java虚拟机栈:生命周期与线程一致,描述Java ...

  8. Ajax 监听

    $.ajaxSetup({ beforeSend: function (XMLHttpRequest) { alert("ajax请求之前"); } });

  9. tensorflow变量

    tensorflow变量: 1.神经网络中的参数权重,偏置等可以作为张量保存到tensorflow的变量中 2.tensorflow变量必须被初始化 3.可被保存到文件中,下次使用重新加载即可 ten ...

  10. Linux基础命令---lpr打印文件

    lpr lpr指令用来打印文件,如果没有指定文件名,那么从标准输入读取内容.CUPS提供了许多设置默认目标的方法.首先查询“LPDEST”和“PRINTER”环境变量.如果没有设置,则使用lpopti ...