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

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();
}

时间: 2025-01-14 11:52:26

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

Android开发中MVP模式浅析

目前为止,MVP的使用还没有一个标准,在此先记录一下目前学习到的一些Android中使用MVP的知识. 按传统的方式开发,经常会使Activity中混杂着UI交互,业务逻辑等流程.而MVP模式能巧妙的解决这个问题.先直接上一个小例子吧. /** * 定义一个对UI组件进行操作的接口,让Activity实现这个接口 * @author Quinn * @date 2015-5-9 */ public interface LoginView { public void showProgress();

Android开发学习---使用Intelij idea 13.1 进行android 开发

原文:Android开发学习---使用Intelij idea 13.1 进行android 开发 1.为什么放弃eclipse?太卡!! 实在受不了eclipse的卡了,运行WEB项目还好,但android开发实在太慢,太慢!经常卡死,CPU经常被占满! 看网上很多人都说比Intelij idea好用,就试下,目前还在test阶段,总之是各种不习惯,很多快捷键之类的跟eclipse完全不一样.还要多熟悉! 另外android studio 也比较卡,而且用起来相当难受,完全是intelij 的

Android开发学习笔记:数据存取之SQLite浅析

一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持 Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl.PHP.Java.C++..Net等,还有ODBC接口,同样比起 Mysql.PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的

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

Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开发学习之路-下拉刷新怎么做? 本篇是接着上面三篇之后的一个对RecyclerView的介绍,这里多说两句,如果你还在使用ListView的话,可以放弃掉ListView了.RecyclerView自动帮我们缓存Item视图(ViewHolder),允许我们自定义各种动作的动画和分割线,允许我们对It

Android开发学习之路--网络编程之xml、json

一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载xampp,然后安装之类的就不再多讲了,参考http://cnbin.github.io/blog/2015/06/05/mac-an-zhuang-he-shi-yong-xampp/.安装好后,启动xampp,之后在浏览器输入localhost或者127.0.0.1就可以看到如下所示了: 这个就

Android开发学习---使用XmlPullParser解析xml文件

Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593 本文将主要介绍pull解析器解析xml文件,环境为ubuntu 12.04+ intelij 13.1 + android sdk 2.1 一.创建一个XML项目,步骤如下: 二.解析一个xml文件: assets/person.xml <?xml version="1.0" encodi

【Android开发学习笔记】【第三课】Activity和Intent

首先来看一个Activity当中启动另一个Activity,直接上代码说吧: (1)首先要多个Activity,那么首先在res-layout下新建一个 Other.xml,用来充当第二个Activity的布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu

android 开发学习笔记 (一)

每个app 都有一个自己的 linux 进程: 每个进程都在自己的虚拟机里执行 两个app 可以跑在一个进程,一个vm里 android app 四大组件:activity,content provider,      services, broardcast receivers Content Resolver 激活 Content Provider You can start an      activity (or give it something new to do) by passi

Android开发学习---template requires a minimum SDK version of at least 7,build target API version of 14

adt 22.6.3的bug 当adt更新到22.6.3,其编辑器中最低支持api7,即android 2.1,这里可能是google故意这么做的,也可能是其bug.其target sdk 和compile sdk最低都为14,即anroid 4.0,这里建议都设为最高的api 19,即android 4.4;否则会一直报错,类似错误如下: This template requires a minimum SDK version of at least 7, and the current mi