MVP 实现原理及简单案例登陆(二)

来源:互联网 发布:vb版电子教室 编辑:程序博客网 时间:2024/06/05 17:02

MVP概述

来自网络

Model层

主要处理与数据相关的操作,如操作数据库、请求服务器等。不与View层直接交互,通过Presenter层与View层互动。

View层

显示界面,对外提供可刷新UI的接口,不做控制操作。如点击登陆按钮后,弹出等待进度框,View层只提供了一个弹出等待进度框的方法,调用弹出是Presenter层通过View的方法调用的(后面会详细介绍)

Presenter层

Presenter层负责与Model层交互,又负责界面UI更新。View层也持有Presenter的引用,来执行用户操作请求

登陆案例

因为案例案例源码相对于快速理解MVP不是很合适,所以先实现一个简单案例,大家理解了大概原理之后,在深入讲解案例源码的实现

项目目录

这里写图片描述

model层

  • ILoginModel.java 接口类
public interface ILoginModel {    /**     * 登陆     */    void login(Map<String, String> param, String url, OnStringCallBack callBack);}
  • LoginModel.java 具体实现
public class LoginModel implements ILoginModel {    private Context mContext;    public LoginModel(Context context) {        this.mContext = context;    }    @Override    public void login(Map<String, String> param, String url, OnStringCallBack callBack) {        //OnStringCallBack是一个回调接口        callBack.onResponse("{'flag':'success'}");    }}

View层

  • IBaseView.java
public interface IBaseView {    /**     * @return 获取上下文     */    Context getContext();    /**     * 显示提示信息     * @param resourceId     */    void showToast(int resourceId);}
  • ILoginView.java
public interface ILoginView extends IBaseView {    /**     * 添加EditText文本改变的监听     */    void addTextChangedListener();    /**     * 显示加载进度框     */    void showProgress();    /**     * 取消加载进度框     */    void dismissProgress();    /**     * 跳转到主界面     */    void jump2MainPager();    /**     * 获取请求参数     *     * @param flag     */    Map<String, String> getParam(int flag);    /**     * 设置删除图标的显示隐藏     * @param resourceId     * @param visibility     */    void setDeleteIconVisibility(int resourceId, int visibility);    /**     * 清除输入框中的文字     * @param resourceId     */    void clearEditText(int resourceId);}
  • LoginActivity.java
    实现ILoginView接口中的方法,详见代码

presenter层

  • IBasePresenter.java
    一些基类方法,当前为空。因为功能简单,没有可抽取的
    -ILoginPresenter.java
public interface ILoginPresenter extends IBasePresenter{    /**     * 登陆     */    void login();    /**     * 文字改变     * @param resourceId     * @param charSequence     */    void textChanged(int resourceId,CharSequence charSequence);    /**     * 点击输入框右侧的删除按钮     * @param resourceId     */    void deleteIconClick(int resourceId);}
  • LoginPresenter.java
    具体实现详见代码

执行流程

Created with Raphaël 2.1.0开始点击登陆调用LoginActivity->onClick//点击事件调用LoginPresenter->login()//登陆方法调用LoginView->getParam(1)、showProgress()、dismissProgress()//登陆方法中的相关操作登陆成功?调用LoginView->jump2MainPager()//跳转到主页结束调用LoginView->showToast("账号或密码错误")//提示登录失败信息yesno

View层抽取原则

当然针对于当前的简单案例,接下来的文章会对复杂案例进行抽取,包括各种细节会做详细说明

1.需要初始化的信息: setOnclickListener、addTextChangedListener诸如此类的,都要抽取View接口方法,方便Presenter初始化时调用(详见LoginPresenter类)。

    /**     * 添加文本改变的监听     */    @Override    public void addTextChangedListener() 

2.显示/取消加载进度框、显示提示信息、获取上下文信息

    /**     * @return 获取上下文     */    Context getContext();    /**     * 显示提示信息     * @param resourceId     */    void showToast(int resourceId);    /**     * 显示加载进度框     */    void showProgress();    /**     * 取消加载进度框     */    void dismissProgress();

3.账号输入框中点击删除按钮的响应事件和文本改变的响应事件。以id为参数

    /**     * 设置删除图标的显示隐藏     * @param resourceId     * @param visibility     */    void setDeleteIconVisibility(int resourceId, int visibility);    /**     * 清除输入框中的文字     * @param resourceId     */    void clearEditText(int resourceId);

4.网络请求成功后,做的跳转事件

    /**     * 跳转到主界面     */    void jump2MainPager();

效果图

这里写图片描述

项目地址

https://github.com/407365100/MVP-LoginDemo

0 0