您的位置:首页 > 其它

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

2016-09-13 14:03 211 查看

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

4000
/**
* 跳转到主界面
*/
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 获取上下文
*/<
b6d8
/span>
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: