<Android 基础(三)> MVP模式

原创 2016年05月31日 20:53:45

前言

MVP,这里指的并不是篮球比赛中的MVP(最有价值球员),而是一种代码框架和设计思想,它是由MVC演变而来的。
MVP模式(Model-View-Presenter)
是MVC模式的一个衍生。主要目的是为了解耦,使项目易于维护。
Model 是业务逻辑和实体模型
View 是包含Presenter的引用。所要做的就是当有交互时,调用Presenter里的对应方法。通常会通过Activity实现
Presenter 是负责完成View于Model间的交互,从Model里取数据,返回给View处理好的数据。

这里写图片描述

MVC模式(Model-View-Controller)
主要目的是讲显示逻辑和业务逻辑独立出来
Model 是应用程序中用于处理应用程序数据逻辑的部分。
View 是应用程序中处理数据显示的部分。
Controller 是应用程序中处理用户交互的部分

这里写图片描述

从构造图上可以看到最主要的差异就是

MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的

MVP使用方法

代码结构
这里写图片描述

代码内容
LoginActivity.java

public class LoginActivity extends AppCompatActivity implements ILoginView {

    @Bind(R.id.usernameWrapper)
    TextInputLayout usernameWrapper;
    @Bind(R.id.passwordWrapper)
    TextInputLayout passwordWrapper;
    @Bind(R.id.bt_clear)
    Button btClear;
    @Bind(R.id.bt_login)
    Button btLogin;

    private LoginPresenterCompl loginPresenterCompl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        ButterKnife.bind(this);

        loginPresenterCompl = new LoginPresenterCompl(this);


    }

    @OnClick({R.id.bt_clear, R.id.bt_login})
    public void onClick(View view) {
        String username = usernameWrapper.getEditText().getText().toString();
        String password = passwordWrapper.getEditText().getText().toString();

        switch (view.getId()) {
            case R.id.bt_clear:
                loginPresenterCompl.clearText();
                break;
            case R.id.bt_login:
                loginPresenterCompl.doLogin(username, password);
                break;
        }
    }

    @Override
    public void onLoginResult(boolean isLogged) {
        if (isLogged) {
            Toast.makeText(this, "Logged in Successfully", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "Logged Failed", Toast.LENGTH_SHORT).show();
        }
        return;
    }

    @Override
    public void onClearText() {
        usernameWrapper.getEditText().setText("");
        passwordWrapper.getEditText().setText("");
        usernameWrapper.clearFocus();
        passwordWrapper.clearFocus();
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(),
                    0);
        }
    }
}

LoginActivity实现ILoginView接口

public interface ILoginView {
    void onLoginResult(boolean isLogged);
    void onClearText();
}

LoginPresenterCompl.java实现ILoginPresenter接口

public class LoginPresenterCompl implements ILoginPresenter{

    private ILoginView iLoginView;
    Handler handler;


    public LoginPresenterCompl(ILoginView loginView) {
        iLoginView = loginView;
        handler = new Handler(Looper.getMainLooper());
    }



    @Override
    public void doLogin(String username, String password) {
        final String tp_username =  username;
        final String tp_password =  password;
        new Thread(new Runnable() {
            @Override
            public void run() {
                boolean isLogged = false ;
                if(UserModel.isValidUser(tp_username , tp_password)) {
                    isLogged = true;
                }
                final boolean tp_isLogged = isLogged;
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        iLoginView.onLoginResult(tp_isLogged);
                    }
                });

            }
        }).start();

    }

    @Override
    public void clearText() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        iLoginView.onClearText();
                    }
                });

            }
        }).start();

    }
}
public interface ILoginPresenter {
    void doLogin(String username, String password);
    void clearText();
}

UserModel.java这个没有怎么使用,但是实际使用过程中不同的Model会有不同的处理方式

public class UserModel {
    public String username;
    public String password;

    public UserModel(String username, String password) {
        this.username = username;
        this.password = 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;
    }

    public static boolean isValidUser(String username, String password){
        return (username.equals("guagua") && password.equals("guagua"));
    }
}

简约类图:
这里写图片描述

效果图

这里写图片描述 这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

<Android 应用 之路> 百度地图API使用(4)

百度地图定位

Hello Struts2 !

新建 JAVA WEB 项目 StrutsTest 拷贝 example Apps 里面的 struts.xml 到 MyEclipse StrutsTest 项目里面的  src 目录下,拷贝 e...
  • mzule
  • mzule
  • 2010-02-02 10:00
  • 254

<Android 应用 之路> 天气预报(一)

Android天气预报客户端设计思路 欢迎界面,版本号,应用名 + 数据后台加载(所有城市的信息获取) 数据加载完成后跳转到显示界面,显示所有查询到的城市的天气信息 欢迎界面和天气显示界面分别为单独的...

<Android 应用 之路> 一个类似今日头条的APP

简介最近花了一两天的时间完成一个简易的新闻头条客户端的应用,引用到了SwipeRefreshLayout,CircleImageView,RxAndroid,Picasso,PhotoPicker等开...

<Android 应用 之路> JuheNews For aNdroid (改进版)

简介上一篇介绍的是最开始自己制作的一个采用聚合数据免费接口制作的一个头条类新闻应用,最近对其在界面上做了很大的改动,结合之前介绍的TabHost作为底部仿微信菜单,然后新闻内容丰富到10种分类,搜索功...

<Android 基础(一)> Service

介绍Service(服务)是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑...

<Android 应用 之路> 聚合数据SDK

聚合数据介绍聚合数据是一个为智能手机开发者,网站站长,移动设备开发人员及图商提供原始数据API服务的综合性云数据平台。包含手机聚合,网站聚合,LBS聚合三部分,其功能类似于Google APIS。【来...

<Android 应用 之路> 天气预报(三)

昨天介绍了基本的载入界面,今天介绍下天气信息显示界面的代码 基本ListView显示 搜索框,查询城市 上一篇文章中,载入界面通过showWeatherInfo()方法跳转到天气信息显示界面 p...

<Android 应用 之路> 百度地图API使用(3)

标注物,地理编码,行政区搜索

<Android 应用 之路> 天气预报(五)

前言写了上一篇文章,讲了下这个实现天气预报的使用内容,现在又到了看代码的时候,主要还是贴代码,然后添加足够的注释。聚合数据SDK配置 将juhe_sdk_v_X_X.jar以及armeabi文件夹(内...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)