Android MVP模式 浅谈

原创 2016年05月31日 21:07:41

先上图:


一、老的MVC架构

         刚开始接触Android的时候会觉得Android的整个代码架构就是一个MVC。
         M : 业务层和模型层,相当与javabean和我们的业务请求代码

         V : 视图层,对应Android的layout.xml布局文件

         C : 控制层,对应于Activity中对于UI 的各种操作

         看起来MVC架构很清晰,但是实际的开发中,请求的业务代码往往被丢到了Activity里面,大家都知道layout.xml的布局文件只能提供默认的UI设置,所以开发中视图层的变化也被丢到了Activity里面,再加上Activity本身承担着控制层的责任。所以Activity达成了MVC集合的成就,最终我们的Activity就变得越来越难看,从几百行变成了几千行。维护的成本也越来越高

二、新的MVP架构

         M : 还是业务层和模型层

         V : 视图层的责任由Activity来担当

         P : 新成员Prensenter 用来代理 C(control) 控制层

         MVP与MVC最大的不同,其实是Activity职责的变化,由原来的C (控制层) 变成了 V(视图层),不再管控制层的问题,只管如何去显示。控制层的角色就由我们的新人 Presenter来担当,这种架构就解决了Activity过度耦合控制层和视图层的问题。

三、一个demo

     理念终归要用代码来实现,来看一个很典型的例子,打开一个有列表的Activity界面,请求数据然后刷新界面

       

        MVP与MVC不同就在于多了2个结构presenter和view。 这里业务层用了一个http,先来看看业务层;
(1)业务层已封装好了okhttp,调用方法也很简单:

       HashMap<String, String> params = null;
	OkHttpClientManager.postAsyn("http://www.baidu.com/rzhtApp_common/ad_list", params, new ResultCallback<ADEntity>() {
		@Override
		public void onError(Request request, Exception e) {
			//访问失败回调
		}
		@Override
		public void onResponse(final ADEntity response) {
			//访问失败的回调
		}
	});
(2)传统的MVC模式:
      比较常见的Activity里面的写法:
      1.界面的初始化
      2.发起请求以及请求完成后的界面更新
      3.点击的监听设置方法。
      C: 控制层(点击事件,网络请求), V : 视图层(界面刷新) 。这样代码都耦合到了Activity里面
(3)MVP模式:
     由于Activity变成了view层不再去控制界面,但是具体的界面的改变api其实还是由Activity来提供的,所以在写MVP之前需要思考,View层需要哪些方法。
     显示loading
     隐藏loading
     listview的初始化
     弹出Toast消息
首先看抽取的接口,MVPView

1.MVPView

public interface MvpView {
	//显示loading progress
	void showLoading();
	//隐藏loading progress
	void hideLoading();
	//ListView初始化
	void setListItem(List list);
	//Toast消息
	void showMessage(String message);
}

      通过上面的MVC的例子,我们可以总结出View层需要的接口。
View的接口抽取完毕,就可以可以编写presenter层了, 在presenter中包含MvpView以及我们的业务类Rhttp,毕竟它相当于View与Model(业务层)的桥梁。

2. MvpPresenter

public class MvpPresenter {
private MvpView mvpView;
public MvpPresenter(MvpView mvpView){
	this.mvpView=mvpView;
}
public void onResume(){
	mvpView.showLoading();
	HashMap<String, String> params = null;
	OkHttpClientManager.postAsyn("http://www.baidu.com/rzhtApp_common/ad_list", params, new ResultCallback<ADEntity>() {
		@Override
		public void onError(Request request, Exception e) {
			mvpView.hideLoading();
			mvpView.showMessage("请求失败");
		}
		@Override
		public void onResponse(final ADEntity response) {
			if (response.returnCode.equals("00")) {
				mvpView.hideLoading();
				mvpView.setListItem(response.adList);
			} else {
				mvpView.showMessage(response.messageInfo);
			}
		}
	});
}
	public void onItemClick(int position){
		mvpView.showMessage("点击了item"+position);
	}
}

Presenter完成,现在就剩下一件事,Activity中使用Presenter

3. MvpActivity

public class MVPActivity extends Activity implements MvpView,OnItemClickListener{
private MvpPresenter mvpPresenter;
private ListView mvpListView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_mvp);
		mvpPresenter=new MvpPresenter(this);
		mvpListView=(ListView) findViewById(R.id.mvp_lv);
	}
	@Override
	protected void onResume() {
		super.onResume();
		mvpPresenter.onResume();
	}
	@Override
	public void showLoading() {
		ProgressUtil.show((this) ,
				getResources().getString(R.string.load_dialog));
	}

	@Override
	public void hideLoading() {
		ProgressUtil.hide();
	}

	@Override
	public void setListItem(List data) {
		ArrayAdapter adapter=new ArrayAdapter(this, R.layout.item_ordinary,data);
		mvpListView.setAdapter(adapter);
	}

	@Override
	public void showMessage(String message) {
		Toast.makeText(this, message, 0).show();
	}

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
		mvpPresenter.onItemClick(position);
	}
	
}
        静静的享受MVP的感觉吧,就是这么清爽,没有乱七八糟的业务,没有各种点击处理逻辑,Activity只需要提供View层的方法就可以了。

四、一点心得

        我们的实际发开中需求往往瞬息万变,每次还要等美工出界面,这样往往会浪费大量时间,但是在MVP的世界这些都不是事,视图层与控制层完全分离,可以让我们在界面还是很粗糙的情况下,先进行控制层的开发,甚至可以先让View层先提供方法出来,这样可以节省很多时间。后面的复杂需求变化,也就是构建接口的时候会变的复杂,但是在有这么多优势的情况下,这点复杂度完全可以接受........

博客链接鸿洋大神:http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820112&idx=1&sn=43de333c4c9d274a4c66f4b021d5b2e2&scene=21#wechat_redirect






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

相关文章推荐

Android设计模式之浅谈MVP

一.概述 MVP(Model-View-Presenter) 是总所周知MVC模式的一个演变,他们的主要目的都是划分模块职责,降低模块耦合,易测试,提高代码复用,这里主要针对Android平台来简单分...
  • l2show
  • l2show
  • 2015年06月27日 11:58
  • 36111

浅谈Android MVP设计模式(简单结合RxJava+Retrofit)

什么是MVP 为什么要用MVP 怎么去完成一个MVP的设计呢 demo实例功能虽小五脏俱全 准备工作 View的基类 presenter的基类 Model的基类 具体的业务实现 转载请指明出处:htt...

浅谈Android架构设计模式中MVC、MVP、MVVM

以下基于对三种模式已经熟悉所总结,不会介绍模式的基础概念,以下是自己结合其他人和自己实际开发中的经验对这些概念一些感悟。 Activity是V还是C 对于Activity属于V还是属于C这...
  • ourpush
  • ourpush
  • 2016年10月01日 22:16
  • 281

浅谈Android中MVP模式用于实际项目中的问题与优化

学习MVP不算久,前段时间才把公司的两个项目完全转换为MVP模式,改了下来,略有心得,给大家分享一下。 才开始学习使用MVP时,看到大家说了很多MVP的优点,代码复用,条理清晰等等。不过我改下来发现,...

浅谈Android中MVC、MVP、MVVM模式(一)

一、MVC模式在Android中的体现     MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。 ...

浅谈MVP模式及其在Android中的实践

前言   相信大家在软件开发中,都会用到各种设计模式, MVP的基本概念   传统中的Android应用开发中, MVP与MVC的区别   MVP是经典MVC的延伸和改进,从MVC的关系图...

Android开发:浅谈MVP模式应用与内存泄漏

最近博主开始在项目中实践MVP模式,却意外发现内存泄漏比较严重,但却很少人谈到这个问题,促使了本文的发布....

浅谈android开发中的MVP模式

看到MVP,大家肯定会想什么是MVP呢?这个我可以肯定的告诉大家MVP(Most Valuable Player)是最有价值球员的意思,这当然是开玩笑了。之所以会出现MVP这种架构模式,是因为我相信大...

Android 浅谈Mvp模式

一、概述对于MVP(Model View Presenter),大家都知道是为了让Model和View完全解耦,MVC的演化版本等等。既然有这样的好处,那么就很适合于用于团队开,各自模块负责,互不干扰...

浅谈Android MVP模式

Android MVP Pattern Android MVP 模式1 也不是什么新鲜的东西了,我在自己的项目里也普遍地使用了这个设计模式。当项目越来越庞大、复杂,参与的研发人员越来越多的时候,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android MVP模式 浅谈
举报原因:
原因补充:

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