Android--再探MVP模式

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了

 

  

 

时间: 2024-12-17 07:37:11

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

Android上的MVP模式

什么是MVP? MVP模式可以分离显示层和逻辑层,所以功能接口如何工作与功能的展示可以实现分离,MVP模式理想化地可以实现同一份逻辑代码搭配不同的显示界面.首先要澄清就是MVP不是一个结构化的模式,它只是负责显示层而已,任何时候都可以在自己的项目结构中使用MVP模式. 为什么要使用MVP? 我们知道在Android上逻辑接口和数据存取是紧耦合的,这个问题可以看看CursorAdapter这个例子,它既融合了适配器,同时也有显示的成分,而cursor很大程度上应该是数据数据存取层的. 对于一个可扩

Android开发中MVP模式浅析

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

Android上实现MVP模式的途径

今天我想分享我在Android上实现MVP(Model-View-Presenter)模式的方法.如果你对MVP模式还不熟悉,或者不了解为什么要在Android应用中使用MVP模式,推荐你先阅读这篇维基百科文章和这篇博客. 使用Activity和Fragment作为View合适么? 目前,在很多使用了MVP模式的Android项目中,主流做法是将Activity和Fragment作为视图层来进行处理.而Presenters通常是通过继承被视图层实例化或者注入的对象来得到的.我认可这种方式可以节省

Android开发之MVP模式的使用

前几天发现,在Android项目代码里有一个Activity类行数居然有1000多行,而600行左右都是逻辑控制,真正和页面控件处理相关的代码不多,虽然可以用#region <>...#endregion块包起来,但是整体来说,页面和逻辑处理揉得太紧密了,有时代码复用起来也不方便,于是,决定重构,找了一下,有MVP(Model-View-Presenter,Model层负责数据管理,View层负责页面控件数据展示与设置,Presenter负责逻辑处理,控制View层如何显示与展示数据,这种层次

Android之 用MVP模式 来实现webview 历史记录保存与显示

MVP在android上是常见的一种设计模式,在Launhcer,手机浏览器里面经常会看到,观摩了下其他大神写的,现在总结下,操刀起来写个demo 有什么问题的地方请提出来. 大家一起研究讨论. demo 下载地址;http://download.csdn.net/detail/xufeifandj/8267619 demo主要是 主页是一个webview,实现了 历史记录的添加,与显示.例子比较简单. 整个项目的结构如下: HistoryPresenter.java 主要是对view与mode

在Android上用MVP模式编程的实践

首先,谁是V?谁是P?(M我认为不是问题) View,应该是实现显示逻辑,在Android开发中,我们认为Fragment.Activity都可以被当做View,他们主要任务就是控制显示逻辑,这部分代码不太经常重用.View通过调用P的业务逻辑,来实现业务.业务包括同步的业务(可以在UI线程操作)和异步的任务(如网络.磁盘IO等耗时操作),并根据P的业务返回结果来响应地改变UI. 对Presenter的实现,我们用AndroidAnnotations框架的EBean实现(如果不熟悉这个框架,请G

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

1.模型与视图完全分离,我们可以修改视图而不影响模型2.可以更高效地使用模型,因为所有的交互都发生在一个地方--Presenter内部3.我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑.这个特性非常的有用,因为视图的变化总是比模型的变化频繁.4.如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试) 下面示例一个小案例: 项目架构: 首先bean层: User.java public class User { privat

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

摘要: 在MVVM成熟之前MVP模式在Android上有被神化的趋势,笔者曾经在商业项目中从零开始大规模采用过MVP模式对项目进行开发.在使用MVP模式进行开发的时候发现项目的结构模式对开发是有一定的影响的,在这里笔者会对这一问题进行探讨.希望通过这篇blog能让读者了解如何使用MVP模式搭建一个功能完善的MVP模式开发框架,避免一些笔者认为比较严重的问题. 为什么要使用MVP模式 在传统的Android开发中,我们一般是使用MVC模式进行开发的.传统MVC模式介绍: View: 视图层,对应x

MVP模式

在传统的Android开发中,我们一般是使用MVC模式进行开发的. 传统MVC模式介绍: View: 视图层,对应xml文件 Controller: 控制层,对应Activity和Fragment层,进行数据处理 Model:实体层,负责获取实体数据 在Android开发中采用MVC模式的一个最大的弊端就是xml作为View层视图能力实在太弱,所以一般情况下我们都是通过Controller层来辅助处理一些视图的.这样的结果就导致Controller既作为控制层的同时又承担了View层的大部分功能