1、模型与视图完全分离,我们可以修改视图而不影响模型
2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部
3、我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)

下面示例一个小案例:

项目架构:

首先bean层:

User.java

public class User {
private String username;
private String password; public String getUsername() {
return username;
} public String getPassword() {
return password;
} public void setUsername(String username) {
this.username = username;
} public void setPassword(String password) {
this.password = password;
}
}

MainActivity.java

public class MainActivity extends AppCompatActivity implements IUserLoginView{
private EditText musername;
private EditText mpasssword;
private Button mlogin;
private Button mclear;
private ProgressBar mpb;
private UserLoginPresenter mUserLoginPresenter = new UserLoginPresenter(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
} private void initView() {
musername = (EditText) findViewById(R.id.username);
mpasssword = (EditText) findViewById(R.id.password);
mlogin = (Button)findViewById(R.id.login);
mclear = (Button)findViewById(R.id.clear);
mpb = (ProgressBar) findViewById(R.id.pb); mlogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mUserLoginPresenter.login();
}
});
mclear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mUserLoginPresenter.clear();
}
}); } @Override
public String getUsername() {
return musername.getText().toString();
} @Override
public String getPassword() {
return mpasssword.getText().toString();
} @Override
public void clearUsername() {
musername.setText(""); } @Override
public void clearPassword() {
mpasssword.setText(""); } @Override
public void showLoading() {
mpb.setVisibility(View.VISIBLE); } @Override
public void hideLoading() {
mpb.setVisibility(View.GONE); } @Override
public void toMainActivity(User user) {
Toast.makeText(this, user.getUsername() +
" login success , to MainActivity", Toast.LENGTH_SHORT).show();
} @Override
public void showFailError() {
Toast.makeText(this,
"login failed", Toast.LENGTH_SHORT).show();
}
}
IUserLoginView.java
public interface IUserLoginView {
//操作的目的
String getUsername();
String getPassword();
void clearUsername();
void clearPassword();
//友好的交互
void showLoading();
void hideLoading();
//操作的结果,对应的反馈
void toMainActivity(User user);
void showFailError(); }
UserLoginPresenter.java
//Model和View的桥梁  login  clear
public class UserLoginPresenter {
private IUserLoginView userLoginView;
private IUserBiz userBiz;
private Handler mHandler = new Handler(); public UserLoginPresenter(IUserLoginView userLoginView){
this.userLoginView = userLoginView;
this.userBiz = new UserBiz();
} public void login()
{
userLoginView.showLoading();
userBiz.login(userLoginView.getUsername(), userLoginView.getPassword(),new OnLoginListener()
{
@Override
public void loginsuccess(final User user)
{
//需要在UI线程执行
mHandler.post(new Runnable()
{
@Override
public void run()
{
userLoginView.toMainActivity(user);
userLoginView.hideLoading();
}
}); } @Override
public void loginfail()
{
//需要在UI线程执行
mHandler.post(new Runnable()
{
@Override
public void run()
{
userLoginView.showFailError();
userLoginView.hideLoading();
}
}); }
});
} public void clear()
{
userLoginView.clearUsername();
userLoginView.clearPassword();
}
}
IUserBiz.java
public interface IUserBiz {
public void login(String username,String password,OnLoginListener loginListener);
}
UserBiz.java
public class UserBiz implements  IUserBiz {

    @Override
public void login(final String username,final String password, final OnLoginListener loginListener) {
new Thread(){
@Override
public void run() {
try
{
Thread.sleep(2000);
} catch (InterruptedException e)
{
e.printStackTrace();
} if("name".equals(username)&&"pwd".equals(password)){
User user = new User();
user.setUsername(username);
user.setPassword(password);
loginListener.loginsuccess(user);
}else{
loginListener.loginfail();
} }
}.start();
}
}

OnLoginListener.java

public interface OnLoginListener {
void loginsuccess(User user);
void loginfail();
}

Android开发学习--MVP模式入门的更多相关文章

  1. Android开发学习--ViewPager使用入门

    ViewPager已经有了滑动的功能 activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...

  2. Android开发学习总结(一)——搭建最新版本的Android开发环境

    Android开发学习总结(一)——搭建最新版本的Android开发环境(转) 最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是 ...

  3. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  4. Android菜鸟的成长笔记(1)——Android开发环境搭建从入门到精通

    原文:Android菜鸟的成长笔记(1)--Android开发环境搭建从入门到精通 今天在博客中看到好多Android的初学者对Android的开发环境的搭建不熟悉而导致不能进行学习,所以我决定自己写 ...

  5. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  6. Android开发学习之路--MAC下Android Studio开发环境搭建

    自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...

  7. Android开发学习路线的七个阶段和步骤

    Android开发学习路线的七个阶段和步骤           Android学习参考路线     第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和St ...

  8. Android开发学习路线图

    Android开发学习方法: Android是一个比较庞大的体系,从底层的Linux内核到上层的应用层,各部分的内容跨度也比较大.因此,一个好的学习方法对我们学习Android开发很重要. 在此建议, ...

  9. android开发学习笔记000

    使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...

随机推荐

  1. Java设计模式-设计模式的六种原则

    所谓无招胜有招,练一门功夫分为内功和外功. 外功好比招式,就是所谓的23种设计模式.而内功呢,就是心法,那就是这6种法则.光会外功那是花拳绣腿,内功修为才是境地. 如此众多的设计模式,学完2遍.3遍可 ...

  2. Ioc 器管理的应用程序设计,前奏:容器属于哪里? 控制容器的反转和依赖注入模式

    Ioc 器管理的应用程序设计,前奏:容器属于哪里?   我将讨论一些我认为应该应用于“容器管理”应用程序设计的原则. 模式1:服务字典 字典或关联数组是我们在软件工程中学到的第一个构造. 很容易看到使 ...

  3. 发现个delphi调用vc写的Dll中包括pchar參数报错奇怪现象

    发现个delphi调用vc写的Dll中包括pchar參数奇怪现象 procedure中的第一行语句不能直接调用DLL的函数,否则会执行报错,在之前随意加上条语句就不报错了奇怪! vc的DLL源代码地址 ...

  4. python 【第二篇】python基本数据类型

    python数据类型 python的数据类型和大多数编程语言一样,有int,float,long,string但是python有三个特殊的数据类型:列表,元组,字典 如果不知道你的数据类型有什么方法: ...

  5. 【内存数据库】OracleTimesten连接DSN创建用户

    ************************************************************************ ****原文:blog.csdn.net/clark_ ...

  6. [IT练习册]Python练习项目 思路

    1.爬虫:爬取如下网站一年的内容. http://www.calvarymoravian.org/dailytext 2.蛇形棋: 开发一个类似蛇形棋的游戏.最好基于Web. 3.爬虫+通讯录: 从公 ...

  7. CSS 对齐方式

    居中设置 Center Align - Using margin Setting the width of a block-level element will prevent it from str ...

  8. 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)

    五.OC基础--1.多态, 1. 多态概念,定义:多态就是某一类事物的多种形态: 表现形式: Animal *ani = [Dog new]; 多态条件:1.有继承关系 2.有方法的重写 2.多态代码 ...

  9. 并不对劲的WC2019

    并不想说"讲了什么"或"考了什么",讲这些的人太多了 过去的那个下位猎人,会为了第一次击败怪物而开心,会在闪光弹扔对方向后得意(然后忘记输出...),会因能够无 ...

  10. Tyvj:1729 文艺平衡树(saply练习)

    您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 Input 第一 ...