Android MVP模式就是这么回事儿
MVP模式
概念就不说了,大家都懂。View层通过Persenter层相互通信,避免了View中大量的业务代码,而将其提取到Model中。其实简单的来说,就是通过接口回调,把业务分离出去。提高代码的可读性和已维护性。
直接看案例就明白了。
案例(用户登录)
常规的用户登录写法就是Activity(fragment)中获取用户名密码,网络请求登录接口,返回是否登录成功
而MVP的模式就是,要把网络请求这一部分单独提取出来放到model层里面,View层也就是我们的Activity只写页面相关的操作,
- 创建LoginModel如下:
package com.cyq.mvppractice.model;
public class LoginModel {
public static boolean login(String username, String password) {
//一般是请求网络接口咯
//具体逻辑我就不写了,这里模拟一下,直接返回登录成功
return true;
}
}
很简单,就是一个常规类和常规操作而已,处理具体的登录网络请求
- 定义一个接口LoginInterface和LoginPersenter类
LoginInterface中又定义了两个接口,View和Persenter分别继承这两个接口,实现View和Persenter层的交互,具体如下
package com.cyq.mvppractice.contract;
public interface LoginInterface {
/**
* View层需要继承这个接口,通过接口方法View层获取返回结果
*/
interface View {
//判断是否登录成功
void isLogin(boolean islogin);
}
/**
* persenter需要继承的接口,通过接口方法传入View层的值
*/
interface Persenter {
//model层需要哪些传入数据从这个接口传入
void goLogin(String username, String password);
}
}
LoginPersenter.class
package com.cyq.mvppractice.persenter;
import com.cyq.mvppractice.contract.LoginInterface;
import com.cyq.mvppractice.model.LoginModel;
public class LoginPersenter implements LoginInterface.Persenter {
//通过构造方法传入view,相当于传入了activity和fragment
private LoginInterface.View view;
public LoginPersenter(LoginInterface.View view) {
this.view = view;
}
/**
* 调用model层业务,最终通过view.isLogin(b),通知view层获取数据
*
* @param username
* @param password
*/
@Override
public void goLogin(String username, String password) {
boolean isLogin = LoginModel.login(username, password);
//回调通知View层
view.isLogin(isLogin);
}
}
最后在View中继承LoginInterface.View接口,实例化LoginInterface.Persenter接口
package com.cyq.mvppractice;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.cyq.mvppractice.contract.LoginInterface;
import com.cyq.mvppractice.persenter.LoginPersenter;
public class LoginActivity extends AppCompatActivity implements LoginInterface.View {
private LoginInterface.Persenter mPersenter;
private EditText usernameEt, passwordEt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mPersenter = new LoginPersenter(this);
usernameEt = findViewById(R.id.et_username);
passwordEt = findViewById(R.id.et_password);
findViewById(R.id.btn_login).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String usernameStr = usernameEt.getText().toString();
String passwordStr = passwordEt.getText().toString();
if ((!TextUtils.isEmpty(usernameStr)) && (!TextUtils.isEmpty(passwordStr)))
mPersenter.goLogin(usernameStr, passwordStr);
else {
Toast.makeText(LoginActivity.this, "请输入用户名或密码", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public void isLogin(boolean islogin) {
if (islogin) {
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
}
}
}
- 就这么简单,把网络请求数据库操作等复杂业务单独放到model层中处理,通过接口回调获得model处理结果返回到View层,也就避免了在View层编写大量的业务逻辑了
- Xml布局如下,就是两个Edittext和一个登陆按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp"
tools:context=".LoginActivity">
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:hint="请输入密码" />
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="登录" />
</LinearLayout>
- 没看懂?再认真看一遍,再写个小demo就ok了,主要是理解其思想
Android MVP模式就是这么回事儿的更多相关文章
- Android MVP模式
转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...
- android MVP模式介绍与实战
android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...
- Android MVP模式 简单易懂的介绍方式
主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200
- Android MVP模式简单易懂的介绍方式 (三)
Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 讲完M和P,接下来就要讲V了.View ...
- Android MVP模式简单易懂的介绍方式 (二)
Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 上一篇文章我们介绍完了Model的创建 ...
- Android MVP模式简单易懂的介绍方式 (一)
Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 最近正在研究Android的MVP模式 ...
- Android MVP模式 谷歌官方代码解读
Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...
- Android mvp模式、mvvm模式
MVC和MVP的区别2007年08月08日 星期三 上午 09:23 MVC和MVP到底有什么区别呢? 从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会 ...
- Xamarin.Android MVP模式
一.简介 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只 ...
随机推荐
- POJ 1131
#include <iostream> #include <string> using namespace std; ]; int main() { //freopen(&qu ...
- Yum Proxy
$ cat /etc/yum.conf[main]cachedir=/var/cache/yum/$basearch/$releaseverkeepcache=0debuglevel=2logfile ...
- android开发中的 Activity 与 Context 区别与联系
Context 是 Application /Activity /Service的基类 Intent(Context , Class); Activity中的上下文Context是随着活动的产生而产生 ...
- Android版本分布——2017年5月更新
Code Name Version API Level Last month This month Change gingerbread(姜饼) 2.3.3——2.3.7 10 0.9% 1.0% 0 ...
- MYSQL 复制详解
MySql 复制介绍 MySQL复制允许将主实例(master)上的数据同步到一个或多个从实例(slave)上,默认情况 下复制是异步进行的,从库也不需要一直连接到主库来同步数据 MySQL复制的数据 ...
- 模型的偏差bias以及方差variance
1. 模型的偏差以及方差: 模型的偏差:是一个相对来说简单的概念:训练出来的模型在训练集上的准确度. 模型的方差:模型是随机变量.设样本容量为n的训练集为随机变量的集合(X1, X2, ..., Xn ...
- Ubuntu-16.04 R 安装及Jupyter notebook 配置
1. R 安装 通常在Terminal下直接apt-get 即可,在16.10下可以get到R-3.3.1,目前最新好像是 R-3.4.2,可以去官方网站下载源码编译 (https://www.r-p ...
- 1-hadoop中遇到的各种异常
本贴记录学习hadoop中遇到的各种异常, 包括推荐系统分类下的和本分类下的, 持续更新 1, 搭建ha时, active和standy之间不能自由切换 经检查, 配置文件错误, 私钥配置 root ...
- onsubmit解惑
1.onsubmit的位置: onsubmit只存在于html <form>中,js的form中 2.submit与onsubmit的区别 发生顺序:onsubmit -> subm ...
- 转载:哈希加密算法 MD5,SHA-1,SHA-2,SHA-256,SHA-512,SHA-3,RIPEMD-160 - aTool
http://www.atool.org/hash.php 一.MD5哈希加密算法 MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致.是计算 ...