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. Android ListView异步载入图片乱序问题,原因分析及解决方式

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android全部系统自带的控件其中,ListView这个控件算是 ...

  2. win7下装ubuntu双系统后无法进入win7的解决方法

    本来电脑的系统是win7,然后用u盘装了ubuntu之后可能会出现开机没有引导界面而直接进入ubuntu系统的情况. 原因:没有设置gurb引导 解决方法:需要更新gurb来使ubuntu识别出win ...

  3. mysql学习笔记之mysql数据库的安装

    1.执行mysql安装包选择自己定义安装(安装路径不要带中文,否则安装会出错! ) 2.一个mysql想要操作成功须要有三部分:server端,数据段,数据. 3.server软件文件夹: 4.数据文 ...

  4. Coding Ninja 修炼笔记 (1)

    大家好啊~我又回来了. 这次主要是给大家带来一些提升 Coding 效率的建议. 效率都是一点一滴优化出来的,虽然每一条建议给你带来的提升可能都不大,但是积累起来,仍然是一股不可忽视的力量. 第一条 ...

  5. POST 请求静态文件 响应405

    使用post方式请求js.html这样的静态文件一般的web服务器都会返回405 Method Not Allowed. 我测试用的web服务器用的是IIS(windows10+IIS10),理论上来 ...

  6. linux中用anaconda使用不同版本python

    1.使用命令conda create --name python36 python=3.6  #你想使用哪个版本就下载哪个版本,--name后面跟的是该虚拟环境的名称 2.需要使用python3.6时 ...

  7. 1分钟看完 jQuery UI

    jQuery UI简介 jQuery UI包含了许多维持状态的小部件(Widget),因此,它与典型的 jQuery 插件使用模式略有不同.所有的 jQuery UI 小部件(Widget)使用相同的 ...

  8. CMake使用总结【转】

    本文转载自:https://www.mawenbao.com/note/cmake.html 总结CMake的常用命令,并介绍有用的CMake资源. CMake意为cross-platform mak ...

  9. HDU4027 Can you answer these queries? —— 线段树 区间修改

    题目链接:https://vjudge.net/problem/HDU-4027 A lot of battleships of evil are arranged in a line before ...

  10. Resolve the error: an error occurred during local report processing

    Issue: an error occurred during local report processing.the definition of the report'Main Report'is ...