1,上一篇我们已经了解了大致的MVP模式,下面再通过这个登录功能的例子 ,我们能过更加容易的掌握MVP模式,再来补充一些闲外话:MVP 是 MVC 的变种,其实是一种升级。要说 MVP 就要说说 MVC,在 MVC 中 Activity 其实是 View层级,但是通常在使用中 Activity即是View也是Controller,并没有将 View层 和 Controller层 进行分离, 耦合度大大提高,非常不利于项目的管理。MVP 把 Activity 中的 UI逻辑 抽象成 View接口,把 业务逻辑 抽象成 Presenter接口,Model类 还是原来的 Model。

2,先来看一下我们这次的简单的布局文件,两个输入框和两个按钮

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.qianmo.mvpdemo.MainActivity"> <EditText
android:id="@+id/editText_user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:hint="Username"/> <EditText
android:id="@+id/editText_pass"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/editText_user"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/editText_user"
android:layout_below="@+id/editText_user"
android:hint="Password"/> <Button
android:id="@+id/button_clean"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/editText_pass"
android:layout_marginLeft="35dp"
android:layout_marginStart="35dp"
android:layout_marginTop="69dp"
android:text="clean"/> <Button
android:id="@+id/button_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/button_clean"
android:layout_alignEnd="@+id/editText_pass"
android:layout_alignRight="@+id/editText_pass"
android:layout_marginEnd="42dp"
android:layout_marginRight="42dp"
android:text="Login"/>
</RelativeLayout>

  在创建我们的功能类LoginContract,包含这个登录功能的,view、presenter、model类,这里推荐使用MVPHelper插件,一步搞定

package com.qianmo.mvpdemo.contract;

/**
* Created by wangjitao on 2016/10/31 0031.
* 用于实现登录功能的实现类
*/
public class LoginContract { public interface View { public void doClean(); public void loginResult(boolean isSuccess, String messing);
} public interface Presenter {
public void clean(); public void doLogin(String username, String password);
} public interface Model { } }

 model实现类

package com.qianmo.mvpdemo.model;

import com.qianmo.mvpdemo.contract.LoginContract;

/**
* Created by MVPHelper on 2016/10/31
*/ public class LoginModelImpl implements LoginContract.Model { 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;
}
}

persenter的实现类

package com.qianmo.mvpdemo.presenter;

import com.qianmo.mvpdemo.MainActivity;
import com.qianmo.mvpdemo.contract.LoginContract; /**
* Created by MVPHelper on 2016/10/31
*/ public class LoginPresenterImpl implements LoginContract.Presenter { private MainActivity mainActivity; public LoginPresenterImpl(MainActivity mainActivity) {
this.mainActivity = mainActivity;
} @Override
public void clean() {
mainActivity.doClean();
} @Override
public void doLogin(String username, String password) {
if ("wangjitao".equals(username) && "123".equals(password)) {
mainActivity.loginResult(true, "user:" + username + ",pass:" + password);
}else {
mainActivity.loginResult(false, "user:" + username + ",pass:" + password);
}
}
}

 最后是我们的UI,也就是我们的Activity

package com.qianmo.mvpdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; import com.qianmo.mvpdemo.contract.LoginContract;
import com.qianmo.mvpdemo.presenter.LoginPresenterImpl; public class MainActivity extends AppCompatActivity implements LoginContract.View, View.OnClickListener {
private EditText et_username;
private EditText et_password;
private Button btn_clean;
private Button btn_login;
private LoginPresenterImpl mLoginPresenter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); et_username = (EditText) findViewById(R.id.editText_user);
et_password = (EditText) findViewById(R.id.editText_pass); btn_clean = (Button) findViewById(R.id.button_clean);
btn_login = (Button) findViewById(R.id.button_login);
mLoginPresenter = new LoginPresenterImpl(this); btn_login.setOnClickListener(this);
btn_clean.setOnClickListener(this);
} @Override
public void doClean() {
et_username.setText("");
et_password.setText("");
} @Override
public void loginResult(boolean isSuccess, String messing) { if (isSuccess) {
Toast.makeText(MainActivity.this, "登陆成功:" + messing, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "登陆失败", Toast.LENGTH_SHORT).show();
}
} @Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.button_clean:
mLoginPresenter.clean();
break;
case R.id.button_login:
mLoginPresenter.doLogin(et_username.getText().toString(), et_password.getText().toString());
break;
}
}
}

  ok,这样的话  感觉一会儿就写出MVP的小demo了

 

  

 

Android--再探MVP模式的更多相关文章

  1. Android 中的MVP 模式

    MVP模式的核心思想: MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成功接口,Model类还是原来的Model. MVC 其中View层其实就是程序的UI界面,用于向用户展示 ...

  2. [译]Google官方关于Android架构中MVP模式的示例

    概述 该示例(TODO-MVP)是后续各种示例演变的基础,它主要演示了在不带架构性框架的情况下实现M-V-P模式.其采用手动依赖注入的方式来提供本地数据源和远程数据源仓库.异步任务通过回调处理. 注意 ...

  3. Android上实现MVP模式的途径

    今天我想分享我在Android上实现MVP(Model-View-Presenter)模式的方法.如果你对MVP模式还不熟悉,或者不了解为什么要在Android应用中使用MVP模式,推荐你先阅读这篇维 ...

  4. Android开发之MVP模式的使用

    前几天发现,在Android项目代码里有一个Activity类行数居然有1000多行,而600行左右都是逻辑控制,真正和页面控件处理相关的代码不多,虽然可以用#region <>...#e ...

  5. Google官方关于Android架构中MVP模式的示例续-DataBinding

    基于前面的TODO示例,使用Data Binding库来显示数据并绑定UI元素的响应动作. 这个示例并未严格遵循 Model-View-ViewModel 或 Model-View-Presenter ...

  6. android中的MVP模式

    1.建立bean public class UserBean { private String mFirstName; private String mLastName; public UserBea ...

  7. Android开发学习--MVP模式入门

    1.模型与视图完全分离,我们可以修改视图而不影响模型2.可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部3.我们可以将一个Presenter用于多个视图,而不需要改变Pr ...

  8. Android开发MVP模式解析

    http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html 在开发Android应用时,相信很多同学遇到和我一样的情况,虽然 ...

  9. Android架构篇--MVP模式的介绍篇

    摘要: 在MVVM成熟之前MVP模式在Android上有被神化的趋势,笔者曾经在商业项目中从零开始大规模采用过MVP模式对项目进行开发.在使用MVP模式进行开发的时候发现项目的结构模式对开发是有一定的 ...

随机推荐

  1. ArcGIS 裁剪地图显示范围

    在argmap工具中,图层属性中,数据框选择“裁剪选项”,“指定范围”,根据一个要素的轮廓,即可以选择需要全屏显示的图层“要素的轮廓”,确定以后地图就自动居中显示,请注意要排除掉超出范围的图层,否则发 ...

  2. 高性能MySQL第1章知识点梳理

    1. MySQL的逻辑架构 最上面不是MySQL特有的,所有基于网络的C/S的网络应用程序都应该包括连接处理.认证.安全管理等. 中间层是MySQL的核心,包括查询解析.分析.优化和缓存等.同时它还提 ...

  3. spring mvc 拦截器 拦截子目录

    项目中碰到这一个问题: 对于/user/loginpage,/user/login这一类的url,放行: 对于/user/{userId}/xxx(xxx不为空)的操作,需要拦截,url-patter ...

  4. 提交form表单不刷新页面案列

    提交form表单不刷新页面其实很简单的,这里拿上传图片来举列,大家有什么其它的方法也欢迎留言告知与我 <form action="" method="post&qu ...

  5. php链接mysql数据库

    php连接数据库有三种方法,刚刚发现通过mysql_connect,mysql_query连接已被废弃,而现在推荐的是通过“面向对象方法”和“PDO方法”连接数据库. 而我在使用面向对象的方法连接时, ...

  6. Git基本命令行操作

    A. 新建Git仓库,创建新文件夹git init  B. 添加文件到git索引git add <filename>  --- 单个文件添加git add * --- 全部文件添加 C. ...

  7. PHP filesystem attack vectors - Take Two

    http://www.ush.it/2009/07/26/php-filesystem-attack-vectors-take-two/ Did you enjoyed our previous &q ...

  8. 采用Hibernate框架的研发平台如何能够真正兼容Oracle和sqlServer数据库

    都说Hibernate框架的使用可以很容易的让你的研发平台支持多种不同类型的数据库,但实践表明,这里的“容易”,是相对的. 想让研发平台支持多种数据库,并不是一件简单的事,也可以这么说:并不是只要使用 ...

  9. array_reduce方法用回调函数迭代地将对数组的值进行操作

    在处理php数组的时候,有一种需求特别的频繁,如下二维数组: $arr = array( 1=>array( 'id' => 5, 'name' => '张三' ), 2=>a ...

  10. C++8002011752鸡兔同笼

    难度级别: A: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外) ...