Android MVP模式实战教程

一、什么是MVP

在网上找了些资料,整理如下:

  MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。

  模型(Model):负责处理数据的加载或者存储,比如从网络或本地数据库获取数据等;
  视图(View):负责界面数据的展示,与用户进行交互;
  主持人(Presenter):相当于协调者,是模型与视图之间的桥梁,将模型与视图分离开来。

如下图所示,View与Model并不直接交互,而是使用Presenter作为View与Model之间的桥梁。其中Presenter中同时持有Viwe层以及Model层的Interface的引用,而View层持有Presenter层Interface的引用。当View层某个界面需要展示某些数据的时候,首先会调用Presenter层的某个接口,然后Presenter层会调用Model层请求数据,当Model层数据加载成功之后会调用Presenter层的回调方法通知Presenter层数据加载完毕,最后Presenter层再调用View层的接口将加载后的数据展示给用户。这就是MVP模式的整个核心过程。

在MVP模式里通常包含4个要素:

(1)View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
     (2)View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;
     (3)Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
     (4)Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。

二、MVP模式的使用

上面一张简单的MVP模式的UML图,从图中可以看出,使用MVP,至少需要经历以下步骤:

1.创建IPresenter接口,把所有业务逻辑的接口都放在这里,并创建它的实现PresenterCompl(在这里可以方便地查看业务功能,由于接口可以有多种实现所以也方便写单元测试)

2.创建IView接口,把所有视图逻辑的接口都放在这里,其实现类是当前的Activity/Fragment

3.由UML图可以看出,Activity里包含了一个IPresenter,而PresenterCompl里又包含了一个IView并且依赖了Model。Activity里只保留对IPresenter的调用,其它工作全部留到PresenterCompl中实现

4.Model并不是必须有的,但是一定会有View和Presenter

三、一个简单的MVP示例

实现一个简单的用户登录

效果如下:

先来看看java文件的目录结构:

1.Baen包

UserBean

package com.example.mvpe.bean; /** * Created by fendo on 2017/4/29. */ public class UserBean { private String username; private String userpwd; public UserBean() { } public UserBean(String username, String userpwd) { this.username = username; this.userpwd = userpwd; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getUserpwd() { return userpwd; } public void setUserpwd(String userpwd) { this.userpwd = userpwd; } }

2.Model包

IUserModel类

package com.example.mvpe.model; import com.example.mvpe.bean.UserBean; /** * Created by fendo on 2017/4/29. */ public interface IUserModel { void setSid(int cid); UserBean load(int sid); void setUsername(String username); void setUserpwd(String userpwd); }

UserModelimp类

package com.example.mvpe.model; import android.provider.Settings; import android.util.Log; import android.util.SparseArray; import com.example.mvpe.bean.UserBean; /** * Created by fendo on 2017/4/29. */ public class UserModelimp implements IUserModel{ private static final String ACTIVITY_TAG="UserModelimp"; private String username; private String userpwd; private int sid; private SparseArray<UserBean> su=new SparseArray<UserBean>(); @Override public void setSid(int cid) { sid=cid; } @Override public UserBean load(int sidy) { sid=sidy; UserBean ub=su.get(sid,new UserBean("not found", "not found")); return ub; } @Override public void setUsername(String usernamey) { username=usernamey; } @Override public void setUserpwd(String userpwdy) { userpwd=userpwdy; UserBean usb=new UserBean(username,userpwd); System.out.print(username+"----"+userpwd+"----"+sid); Log.d(UserModelimp.ACTIVITY_TAG, "Start_OK"+username+"----"+userpwd+"----"+sid); su.append(sid,usb); } }

3.persenter包

UserPersenter类

package com.example.mvpe.presenter; import android.util.Log; import android.view.View; import com.example.mvpe.bean.UserBean; import com.example.mvpe.model.IUserModel; import com.example.mvpe.model.UserModelimp; import com.example.mvpe.view.IUserView; /** * Created by fendo on 2017/4/29. */ public class UserPersenter { private static final String ACTIVITY_TAG="UserPersenter"; private IUserView iUserView; private IUserModel iUserModel; public UserPersenter(IUserView view){ iUserView=view; iUserModel=new UserModelimp(); } public void saveuser(int sid,String username,String userpwd){ iUserModel.setSid(sid); iUserModel.setUsername(username); iUserModel.setUserpwd(userpwd); } public void loaduser(int sid){ UserBean usb=iUserModel.load(sid); Log.d(ACTIVITY_TAG, "loaduser: "+usb.getUsername()); iUserView.setUsername(usb.getUsername()); iUserView.setUserpwd(usb.getUserpwd()); } }

4.view包

IUserView类

package com.example.mvpe.view; import com.example.mvpe.bean.UserBean; /** * Created by fendo on 2017/4/29. */ public interface IUserView { int getID(); void setUsername(String username); void setUserpwd(String userpwd); String getUserpwd(); String getUsername(); }

UserActivity类

package com.example.mvpe.view; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.example.mvpe.R; import com.example.mvpe.presenter.UserPersenter; import android.view.View.OnClickListener; import android.widget.Toast; /** * Created by fendo on 2017/4/29. */ public class UserActivity extends Activity implements OnClickListener,IUserView{ private EditText userid; private EditText username; private EditText userpwd; private Button read; private Button write; private UserPersenter usp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); usp=new UserPersenter(this); setContentView(R.layout.activity_main); findviewbyid(); read.setOnClickListener(this); write.setOnClickListener(this); } public void findviewbyid(){ userid= (EditText) findViewById(R.id.userid); username= (EditText) findViewById(R.id.usertext); userpwd= (EditText) findViewById(R.id.userpwd); read= (Button) findViewById(R.id.read); write= (Button) findViewById(R.id.write); } @Override public int getID() { return Integer.parseInt(userid.getText().toString()); } @Override public void setUsername(String usernamcc) { username.setText(usernamcc); } @Override public void setUserpwd(String userpw) { userpwd.setText(userpw); } @Override public String getUserpwd() { return userpwd.getText().toString(); } @Override public String getUsername() { return username.getText().toString(); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.read : usp.loaduser(getID()); Toast.makeText(getApplicationContext(), "点击了读"+getID(), Toast.LENGTH_SHORT).show(); break; case R.id.write: usp.saveuser(getID(),getUsername(),getUserpwd()); Toast.makeText(getApplicationContext(), "点击了存"+getID()+"--"+getUsername()+"--"+getUserpwd(), Toast.LENGTH_SHORT).show(); break; } } }

可以看到View只负责处理与用户进行交互,并把数据相关的逻辑操作都扔给了Presenter去做。而Presenter调用Model处理完数据之后,再通过IUserView更新View显示的信息。

下载:源码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-25 18:57:20

Android MVP模式实战教程的相关文章

Android MVP模式ListView中嵌入checkBox的使用方法_Android

MVP模式 ListView中嵌入checkBox的使用 本文写的是一个小demo,如何在ListView中嵌入checkBox配合使用,本篇文章与前面的嵌入Button类似,同样的采用MVP模式的写代码,本次案例中会有几个小细节,我将会在案例中介绍. 程序基本框架如下: View层: MainActivity.java public class MainActivity extends AppCompatActivity implements ViewInter<MyBean>{ //Lis

Android MVP模式ListView中嵌入checkBox的使用方法

MVP模式 ListView中嵌入checkBox的使用 本文写的是一个小demo,如何在ListView中嵌入checkBox配合使用,本篇文章与前面的嵌入Button类似,同样的采用MVP模式的写代码,本次案例中会有几个小细节,我将会在案例中介绍. 程序基本框架如下: View层: MainActivity.java public class MainActivity extends AppCompatActivity implements ViewInter<MyBean>{ //Lis

详解MVP模式在Android开发中的应用_Android

一.MVP介绍  随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生. 在MVP模式里通常包含4个要素:  (1)View:负责绘制UI元素.与用户进行交互(在Android中体现为Activity); (2)View interface:需要View实现的接口,Vi

MVP模式

最近在公司开发时用到了一种挺特别的设计模式,这种模式很好的把UI分离出来,它把UI抽象出一个View,然后独立出一个Presentation来对View进行控制,把BLL很好的与UI接起来,这上面所提到的就是我们接下来要了解的MVP模式. 好,下面让我们先看看一个应用程序的体系结构: 上图是从微软的msdn上拿下来的,很清晰可以看到,我们会把系统分为了好几块,分了这几块后本人感觉到的好处有两个: 一是把系统很好的分层了,以后维护起来也是挺方便的,特别是在Presentation与UI这两层. 二

MVP模式在Android项目中的使用

  以前在写项目的时候,没有过多考虑架构模式的问题,因为之前一直做J2EE开发,而J2EE都是采用MVC模式进行开发的,所以在搭建公司项目的时候,也 是使用类似MVC的架构(严格来讲,之前的项目还算不上MVC模式,只是简单将网络请求与界面分离,然后通过Handle通知更新界面).这种写法,在后 面随着项目越来越大,Activty或者Fragment中代码也会越来越多,导致项目的维护变的越来越复杂.所以需要另外一种架构模式来解决这个问题, 在网上浏览了一圈,发现适合Android开发的架构模式非M

Android开发模式之MVC,MVP和MVVM的简单介绍与区别

相信大家对MVC,MVP和MVVM都不陌生,作为三个最耳熟能详的Android框架,它们的应用可以是非常广泛的,但是对于一些新手来说,可能对于区分它们三个都有困难,更别说在实际的项目中应用了,有些时候想用MVP的,代码写着写着就变成了MVC,久而久之就对它们三个的选择产生了恐惧感,如果你也是这样的人群,那么这篇文章可能会对你有很大的帮助,希望大家看完都会有收获吧! 文章重点: (1)了解并区分MVC,MVP,MVVM. (2)知道这三种模式在Android中如何使用. (3)走出data bin

Android初尝甜果之MVP模式

原文链接 对于WEB开发者来说,MVC模式是铭刻在心的.相信很大一部分在开发界的朋友都对MVC有些许了解,MVP是适用于Android项目下的类似MVC模式,区别是Controller换成了Presenter来分发数据和视图的控制. 首先看下MVP整体结构: 其中model对应着M,presenter对应P,view对应V.以一个简单的保存用户信息的例子来说明整个项目! 第一步建立对应用户的实体类UserBean public class UserBean { public static fin

Adapter模式实战之重构鸿洋集团的Android圆形菜单建行

对于很多开发人员来说,炫酷的UI效果是最吸引他们注意力的,很多人也因为这些炫酷的效果而去学习一些比较知名的UI库.而做出炫酷效果的前提是你必须对自定义View有所理解,作为90的小民自然也不例外.特别对于刚处在开发初期的小民,对于自定义View这件事觉得又神秘又帅气,于是小民决定深入研究自定义View以及相关的知识点. 在此之前我们先来看看洋神的原版效果图: 记得那是2014年的第一场雪,比以往时候来得稍晚一些.小民的同事洋叔是一位资深的研发人员,擅长写UI特效,在开发领域知名度颇高.最近洋叔刚

详解MVP模式在Android开发中的应用

一.MVP介绍 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生. 在MVP模式里通常包含4个要素: (1)View:负责绘制UI元素.与用户进行交互(在Android中体现为Activity); (2)View interface:需要View实现的接口,View