MVP手机封装工艺艺中MVP是什么意思

分分钟理解什么叫MVP模式
分分钟理解什么叫MVP模式
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。
在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示,及View。所以,在MVC模型里,Model不依赖于View,但是View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。
我们直接看代码:
我们把可视化组件统一当成View,这里面把Activity,Fragment也归类为View层:
MainActivity:
package com.kakasure.mvpdemo.v;
import android.os.B
import android.support.v7.app.AppCompatA
import android.view.M
import android.view.MenuI
import android.view.V
import android.widget.B
import android.widget.TextV
import com.kakasure.mvpdemo.R;
import com.kakasure.mvpdemo.callback.ActivityC
import com.kakasure.mvpdemo.p.MainP
* dashentao
public class MainActivity extends AppCompatActivity implements ActivityCallback {
private TextV
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button1);
textview = (TextView) findViewById(R.id.textview1);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
MainPersenter.getInstance().Opreation1(MainActivity.this);
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
return super.onOptionsItemSelected(item);
public void toUI(int action, Object object) {
switch (action) {
case MainPersenter.ACTION_1:
if (object != null) {
textview.setText((String) object);
protected void onDestroy() {
super.onDestroy();
MainPersenter.getInstance().destoryInstance();
P层负责请求的封装与结果的回调:
package com.kakasure.mvpdemo.p;
import android.graphics.AvoidX
import android.os.M
import com.kakasure.mvpdemo.callback.ActivityC
import com.kakasure.mvpdemo.m.M
import java.util.AbstractC
* Created by Administrator on .
public class MainPersenter extends BasePersenter {
private static MainP
private static Object object = new Object();
public static MainPersenter getInstance() {
if (persenter == null) {
synchronized (object) {
if (persenter == null) {
persenter = new MainPersenter();
public void Opreation1(ActivityCallback activityCallback) {
mActivityCallback = activityC
Model model = new Model();
String result = model.test1();
Message message = Message.obtain();
message.what = ACTION_1;
message.obj =
sendMsg(message);
public void destoryInstance() {
if (persenter != null) {
persenter = null;
object = null;
核心的回调功能具体由BaseP统一负责:
package com.kakasure.mvpdemo.p;
import android.os.H
import android.os.L
import android.os.M
import com.kakasure.mvpdemo.callback.ActivityC
* Created by Administrator on .
public abstract class BasePersenter {
protected ActivityCallback mActivityC
* 动作唯一绑定标志
public static final int ACTION_1 = 1;
private void toUI(Message msg) {
if (mActivityCallback != null) {
mActivityCallback.toUI(msg.what, msg.obj);
private Handler myHandler = new Handler(Looper.myLooper()) {
public void handleMessage(Message msg) {
super.handleMessage(msg);
toUI(msg);
protected void sendMsg(Message message) {
myHandler.sendMessage(message);
* 调用实例销毁时同步销毁Persenter实例,避免单例长期被持有,导致潜在的内存泄露
public abstract void destoryInstance();
主要负责数据的组合
package com.kakasure.mvpdemo.m;
* Created by Administrator on .
public class Model {
public Model() {}
public String test1() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i & 10; i++) {
sb.append(i + "");
return sb.toString();
回调接口(非常重要):
package com.kakasure.mvpdemo.
import android.animation.ObjectA
* Created by Administrator on .
public interface ActivityCallback {
* return to UI&br/&
void toUI(int action, Object object);
BaseP会通过由操作实例注册进来的callback进行数据分发:
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
MainPersenter.getInstance().Opreation1(MainActivity.this);
public void Opreation1(ActivityCallback activityCallback) {
mActivityCallback = activityC
Model model = new Model();
String result = model.test1();
Message message = Message.obtain();
message.what = ACTION_1;
message.obj =
sendMsg(message);
private void toUI(Message msg) {
if (mActivityCallback != null) {
mActivityCallback.toUI(msg.what, msg.obj);
private Handler myHandler = new Handler(Looper.myLooper()) {
public void handleMessage(Message msg) {
super.handleMessage(msg);
toUI(msg);
protected void sendMsg(Message message) {
myHandler.sendMessage(message);
最后数据的返回结果丢给调用实例进行处理:
这样View层根本不需要关心数据的组装过程,只关心结果,从而达到功能解耦。
public void toUI(int action, Object object) {
switch (action) {
case MainPersenter.ACTION_1:
if (object != null) {
textview.setText((String) object);
有几点需要特别注意:
1:请求动作的Action标志做唯一化,这样容易管理,并且功能区分明显;
public abstract class BasePersenter {
protected ActivityCallback mActivityC
* 动作唯一绑定标志
public static final int ACTION_1 = 1;
2 : 当Activity销毁不用时尽量调用destoryInstance释放单例实例,避免长期持有,造成潜在的内存泄露:
protected void onDestroy() {
super.onDestroy();
MainPersenter.getInstance().destoryInstance();
这里只是抛砖引玉,具体的封装自己可以随便玩,哈哈
github代码链接:
Android MVP模式 简单易懂的介绍方式
浅谈MVP架构及开发模式
MVP模式原理分析 以及两个实例带你飞
Android 多Fragment共享数据的MVP模式实现
谈谈关于MVP模式中V-P交互问题
MVP模式从入门到精通
Android中MVP模式讲解及实践
浅谈安卓MVP模式
MVP 设计模式理解,实战理解MVP
没有更多推荐了,Android 从实现到封装一个MVP - 简书
Android 从实现到封装一个MVP
MVP之间的联系
大概简单的解释就是M-&module处理数据,V-&Act显示界面,P-&M和V沟通的渠道,即P用来将数据和界面联系到一起,这样子界面和数据就可以完全独立开来,Act只做界面相关的事情,Module只处理数据,P只负责两者沟通从而实现解耦。
简单的实现一个没有任何封装的MVP
以登录界面为例子,它需要的文件大概是以下
ILoginView LoginPresenter需要和LoginAct互动的方法,比如说presenter需要获得通过act登录框的姓名,而act需要presenter处理登录数据后的返回值code
public interface ILoginView {
String getUserName();
String getUserPwd();
void onSuccess(String code);
IRequestLoginLoginPresenter需要和LoginModule互动的方法,比如说presenter需要通过module获取登录结果,而module需要presenter传递给他username和pwd,并传递一个实例化好的接口过去用来回调返回值
public interface IRequestLogin {
void toLogin(String userName, String pwd, IRequestResult requestResult);
IRequestResultLoginPresenter需要实时获取LoginModule的返回结果
public interface IRequestResult {
void onSuccess(String result);
void onFailed(String result);
3个管道定义好后就可以去实现3个MVP的主题module,view,presenter
LoginAct实现自ILoginView接口,并持有present的对象,从而实现LoginPresenter和它的交互,可以看到act并没有任何处理数据的地方,他要做的只是提供姓名和密码给presenter,通过present去登录,并且接收presenter处理后的返回值code。
public class LoginAct extends AppCompatActivity implements ILoginView {
private static final String TAG = "LoginAct";
LoginPresenter loginPresenter = new LoginPresenter();
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loginPresenter.tologin(this);
public String getUserName() {
return "userName";
public String getUserPwd() {
return "userPwd";
public void onSuccess(String code) {
Log.e(TAG, code);
LoginModule只用来做数据的处理,例如通过presenter传递过来的name和pwd去请求服务器从而获取code,并通过接口返回给presenter
public class LoginModule implements IRequestLogin{
public void toLogin(String name, String pwd, IRequestResult requestResult) {
requestResult.onSuccess("success-&"+name+" "+pwd);
LoginPresenter用来做两者沟通的桥梁,他持有2个对象一个module一个view可以看出来他是中间件,用来操作module和view让他们之间可以联系到一起,当act发起登录操作时,他通过view获取到name和pwd并通过module去请求服务器拿到返回值,之后又传递给act。
public class LoginPresenter implements IRequestResult {
private LoginModule loginM
private ILoginView loginV
public void tologin(LoginAct loginAct) {
loginView = loginA
loginModule = new LoginModule();
loginModule.toLogin(loginView.getUserName(), loginView.getUserName(), this);
public void onSuccess(String result) {
loginView.onSuccess(result);
public void onFailed(String result) {
简单的实现后,进行封装Base
看到3个接口不见了。。因为将他们放在了BaseContract文件中,比较省事。。。contract(契约类)名字自己想一个就好。。不用那么认真。。
BaseContract虽然没有什么共有的因素,还是留一个base,万一以后有需求。。IBaseModule用来实现所有处理数据中的共同点,例如所有的module都要请求数据返回一个string
public class BaseContract {
public interface IBaseModule {
public interface IBasePresenter {
public interface IBaseView {
void showToast(String msg);
BaseAct用来封装act共有的属性,例如所有的act都会实现一个IBaseView接口,并且都会持有一个presenter对象,在oncreate中实例化presenter,并且实例化presenter中的module和view
public abstract class BaseAct&V extends BaseContract.IBaseView,P extends BasePresenter& extends AppCompatActivity implements BaseContract.IBaseView {
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter = initPresenter();
if (presenter != null) {
presenter.attatchWindow(initModule(),this);
initView();
protected abstract void initView();
protected abstract P initPresenter();
protected abstract BaseModule initModule();
protected void onDestroy() {
super.onDestroy();
presenter.detachWindow();
BaseModule不做任何处理
public class BaseModule implements BaseContract.IBaseModule {
BasePresenter同时持有module和view,在actdestory的时候释放
public class BasePresenter&M extends BaseModule, V extends BaseContract.IBaseView& {
void attatchWindow(M m, V v) {
this.module =
this.view =
void detachWindow() {
this.module =
this.view =
使用Base之后的Act
LoginContract和之前一样,定义需要交互的数据
public class LoginContract {
interface ILoginView extends BaseContract.IBaseView {
String getName();
String getPwd();
void onLoginResult(String code);
public interface ILoginPresenter extends BaseContract.IBasePresenter {
void getResult(LoginBean bean);
public interface ILoginModule extends BaseContract.IBaseModule {
void toLogin(String name, String pwd, ILoginPresenter iLoginPresenter);
LoginAct 省去了初始化presenter的步骤
public class LoginAct extends BaseAct&LoginContext.ILoginView, LoginPresenter& implements LoginContext.ILoginView {
private static final String TAG = "LoginAct";
public void showToast(String msg) {
protected void onResume() {
super.onResume();
presenter.toLogin();
protected BaseModule initModule() {
return new LoginModule();
protected void initView() {
protected LoginPresenter initPresenter() {
return new LoginPresenter();
public String getName() {
return "name";
public String getPwd() {
return "pwd";
public void onLoginResult(String code) {
Log.e(TAG, code);
LoginModule请求数据返回结果,差别不大
public class LoginModule extends BaseModule implements LoginContract.ILoginModule {
public void toLogin(String name, String pwd, LoginContract.ILoginPresenter iLoginPresenter) {
//网络操作,返回数据
LoginBean loginBean = new LoginBean();
loginBean.setCode(name + pwd);
iLoginPresenter.getResult(loginBean);
LoginPresenter省去实例化module和view的步骤
public class LoginPresenter extends BasePresenter&LoginModule, LoginAct& implements LoginContract.ILoginPresenter {
public void toLogin() {
module.toLogin(view.getName(), view.getPwd(), this);
public void getResult(LoginBean bean) {
view.onLoginResult(bean.getCode());
综上就是从实现到封装一个mvp的简易过程。。。但是优化的道路还很漫长。。
每一天,都要让自己更好。。。。
我的掘金 : https://juejin.im/user/db4c69
我的gayhub:
https://github.com/superSp
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
转载至:http://www.jianshu.com/p/9a “Android MVP 详解(下)”已经发布,欢迎大家提建议。 MVP 在 Android 上的使用其实已经有挺长一段时间了,长到似乎有点“过时”了(目前风头正劲的是MVVM),那为什么现...
作者:李旺成 时间:日 “Android MVP 详解(下)”已经发布,欢迎大家提建议。 MVP 在 Android 上的使用其实已经有挺长一段时间了,长到似乎有点“过时”了(目前风头正劲的是MVVM),那为什么现在还要讲 MVP。今天我想要讨论它的主要原因...
我给这篇关于Android库的博客起的名字灵感来源于《老爸老妈浪漫史》中的建筑设计师Ted Mosby。这个Mosby库可以帮助大家在Android上通过Model-View-Presenter模式做出一个完善稳健、可重复使用的软件,还可以借助ViewState轻松实现屏幕...
休学申请还没有批下来。初含只得继续去学校上课。 从学生处领回盖好章的申请单,又送到中文系主人办公室。系主任和之前的大波浪一样,唠叨个不停,好像接过了后面跑来的选手的接力棒,在游说她“最重要的是完成学业”的道路上越跑越来劲。 初含站在他的办公桌旁,认真地注视着他。他的头发在中...
蜂王浆具有很高的营养价值,一直是十分珍贵的营养品。高营养价值的蜂王浆其实也是美容护肤的极佳材料,以下是一些利用蜂王浆美容护肤的方法。 1、小成本美容方法 先把脸彻底洗干净,用手指蘸少许蜂王浆均匀地搽在脸上,并轻轻按摩面部二三分钟。10分钟后就会感觉到脸开始有紧绷感,20分钟...
你爱一个人吗?让他看国际米兰吧,他会爱上这支勇敢而激情的蓝黑色球队。你恨一个人吗?让他看国际米兰吧,他会为这支球队莫名其妙的沉沦而痛苦不已。 (图)蓝黑军团,踏上征程 自从三冠王赛季结束之后,似乎是花光了所有运气,也似乎是失去了所有动力,国际米兰开始陷入了又一次漫长的低谷期...
今天在同一段时间内,先后被两名男性同事委婉提及,你该好好打扮自己了,多穿些职业装,画个淡妆。略微有些小尴尬,难道我之前的穿着打扮这么对不起观众? 穿的是日常休闲打扮,简单舒服,没画妆的脸上显得有些蜡黄,头发松松垮垮的搭着,好吧,我承认这个形象有些过于粗糙了。那为什么我自己没...
我是一名刚毕业的初中生,新高一。
偶然一次和我的一个初中同学一起吃饭,她告诉我,我们初中的英语老师自杀了。
我很意外,因为我对她的印象,是一个非常时髦的年轻老师,对的非常时髦,每天高跟鞋,衣服一周不重样,把自己打扮的漂漂亮亮的,我非常想不通,这么爱美的一个人...&>&MVP高级封装
MVP高级封装
上传大小:88KB
对安卓mvp模式从入门到高级的实现
综合评分:4
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有7条
不高级,只能算低级。至少生命周期都没看见怎么处理的
还不错。虽然一辆懵逼。
不错 谢谢楼主分享
VIP会员动态
热门资源标签
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
MVP高级封装
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
MVP高级封装【android mvp架构封装】 - CSDNMVP架构的理解和使用
一、MVP:(Model-View-Presenter)
1、View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity)
2、Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合)
3、Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
二、MVP使用:
1、BaseView的接口:定义通用view接口
* View的基类接口
* 定义一些通用的接口,例如显示加载页面,取消加载页面等
public interface BaseView {
void showLoading();
void stopLoading();
}2、BasePresenter基类:
关联view和model,(使用了RxJava,抽取添加入订阅队列和取消注册的相关方法)
public class BasePresenter&V,M& {
private CompositeSubscription mCompositeS
public BasePresenter(){
public BasePresenter(V view){
this.view =
model = createModel();
* 创建model
* @return model对象
public M createModel(){
//Rxjava取消注册,避免内存泄露
public void onUnsubscribe(){
if (mCompositeSubscription!=null&&mCompositeSubscription.hasSubscriptions()){
mCompositeSubscription.unsubscribe();
if (view!=null){
//添加到订阅的队列
public void addSubscription(Observable observable, Subscriber subscriber){
if (mCompositeSubscription==null){
mCompositeSubscription = new CompositeSubscription();
mCompositeSubscription.add(observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber));
}3、BaseActivity:
通用的activity基类
public abstract class BaseActivity extends Activity{
public String TAG = //log
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getContentViewID() != 0) {
setContentView(getContentViewID());
//管理activity,将activity添加到集合中
BaseAppManager.getInstance().addActivity(this);
ButterKnife.bind(this);
TAG = this.getClass().getSimpleName();
//使用logUtils,统一管理是否显示log
LogUtils.init(TAG);
findView();
initView();
* 初始化控件
public void findView(){
* 给控件赋值
public void initView(){
* bind layout resource file
protected abstract int getContentViewID();
protected void onDestroy() {
super.onDestroy();
//将销毁的activity在集合中移除
BaseAppManager.getInstance().removeActivity(this);
4、MVP模式的基类Activity:
抽取了初始化Presenter和取消网络请求的方法
public abstract class BaseMVPActivity&P extends BasePresenter& extends BaseActivity{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter = initPresenter();
* 初始化Prensenter
public abstract P initPresenter();
protected int getContentViewID() {
* 避免内存泄露,activity销毁,取消网络请求
protected void onDestroy() {
super.onDestroy();
if (presenter!=null){
presenter.onUnsubscribe();
}三、登录页面的例子:
1、LoginContract:
契约类,用来管理view、present、model相关接口
public interface LoginContract {
interface Presenter{
void login(String mobile,String code);
//发送验证码
void sendVifycode(String moble);
interface View extends BaseView{
void showSendVifyToast(BaseEntity&String& baseEntity);
void loginSuccess(BaseEntity&UserEntity& userEntity);
//网络请求接口
interface Model {
//登录接口
@GET("user/vercodeLogin.go")
Observable&BaseEntity&UserEntity&& login(@Query("mobileNo") String phone,@Query("vercode") String code,@Query("appType") int type);
//发送验证码的接口
@GET("user/sendVerCode.go")
Observable&BaseEntity&String&& sendVifyCode(@Query("mobileNo") String phone);
}2、LoginActivity:
实现view接口,用来和presenter进行交互
public class LoginActivity extends BaseMVPActivity&LoginPresenter& implements LoginContract.View, View.OnClickListener {
private EditText mobileT //手机号
private EditText vercodeT//验证码
private Button submitB //发送验证码按钮
private Button loginB//登录按钮
protected int getContentViewID() {
return R.layout.activity_
public void findView() {
super.findView();
mobileText = (EditText) findViewById(R.id.id_login_mobilno_value);
vercodeText = (EditText) findViewById(R.id.id_login_vercode_value);
submitBtm = (Button) findViewById(R.id.id_login_vercode_btn);
loginBtm = (Button) findViewById(R.id.id_login_btn);
submitBtm.setOnClickListener(this);
loginBtm.setOnClickListener(this);
public LoginPresenter initPresenter() {
return new LoginPresenter(this);
//发送验证码后的页面处理
public void showSendVifyToast(BaseEntity&String& baseEntity) {
//登录成功
public void loginSuccess(BaseEntity&UserEntity& userEntity) {
startActivity(new Intent(this,MyActivity.class));
public void onClick(View v) {
switch (v.getId()) {
case R.id.id_login_vercode_btn:
presenter.sendVifycode(mobileText.getText().toString());
case R.id.id_login_btn:
presenter.login(mobileText.getText().toString(),vercodeText.getText().toString());
}3、LoginPresenter:用来关联view层和model层
public class LoginPresenter extends BasePresenter&LoginActivity,LoginModel& implements LoginContract.Presenter{
public LoginPresenter(LoginActivity view) {
super(view);
public LoginModel createModel() {
return new LoginModel();
public void login(String mobile, String code) {
addSubscription(model.login(mobile,code,0),new SubscriberCallBack(new ApiCallBack&BaseEntity&UserEntity&&() {
public void onSuccess(BaseEntity&UserEntity& model) {
//登录成功
view.loginSuccess(model);
public void onFailure() {
public void onCompleted() {
public void sendVifycode(String moble) {
addSubscription(model.sendVifyCode(moble),new Subscriber&BaseEntity&String&&() {
public void onCompleted() {
public void onError(Throwable e) {
public void onNext(BaseEntity&String& baseEntity) {
view.showSendVifyToast(baseEntity);
}4、LoginModel
进行和presenter交互,处理网络请求
public class LoginModel extends BaseModel implements LoginContract.Model {
LoginContract.Model service = BaseHttpMethod.getInstance().create(LoginContract.Model.class);
public Observable&BaseEntity&UserEntity&& login(String phone,String code,int type) {
return service.login(phone,code,type);
public Observable&BaseEntity&String&& sendVifyCode(String phone) {
return service.sendVifyCode(phone);
总结:mvp的变异使用
1、model层主要是bean,presenter进行网络请求
2、去掉Contract契约类,不进行相关接口管理。有的甚至去掉接口,直接定义方法进行view和presenter的交互。
3、结合mvvm,使用viewmodel,进行view和model的数据绑定,从model获取必要数据,提供给view进行展示。
MVP模式原理分析 以及两个实例带你飞
MVP实战心得(二)---Base基类的封装
Base封装(一)--我的最简MVP架构
Android 简单封装一个MVP基类
安卓开发 第四篇 我的安卓应用架构设计-----Presenter类
安卓MVP浅析及Presenter的生命周期问题
Android:聊聊 MVP 中 Presenter 的生命周期
对MVC、MVP、MVVM的理解
没有更多推荐了,

我要回帖

更多关于 半导体封装工艺 的文章

 

随机推荐