Android设计模式——MVP
一、什么是MVP
MVP:全称 Model-View-Presenter。
MVP框架由3部分组成:View层负责显示,Presenter层负责逻辑处理,Model层提供数据。
View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity,Fragment)
Model:负责存储、检索、操纵数据
Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
二、创建Model Presenter View三个包
三、代码编写
1.View层代码
view层负责界面操作,如何确定view层里面有那些操作呢?
拿我这个UserView举例.
onLogin代表登录时候要做的事情,比如显示一个进度dialog
loginSuccess代表登录成功后要做的事情,做界面跳转等操作
loginFail表示登录失败后得操作,显示一个Toast等
public interface UserView{
void onLogin();
void loginSuccess(UserBean bean);
void loginFail(Exception e,int code);
}
2.Presenter层代码
这层主要负责View层和Model层的连接,也有中间人得意思,
View层请求Presenter层,Presenter在请求Model层,Model层处理数据之后通过回调接口传递给Presenter层,Presenter在传递给View层
在上一张图
public class UserPresenter implements UserCallback {
private UserView mUserView;
private UserModel mModel;
public UserPresenter(UserView baseView) {
mUserView = baseView;
mModel= new UserModel(this);
}
public void userLogin(String name, String pass){
mUserView.onLogin();
mModel.userLogin(name,pass);
}
@Override
public void onSuccess(UserBean bean) {
mUserView.loginSuccess(bean);
}
@Override
public void onFail(Exception e, int code) {
mUserView.loginFail(e,code);
}
}
public interface UserCallback {
void onSuccess(UserBean bean);
void onFail(Exception e ,int code);
}
3.model层代码
model层进行网络请求等耗时任务处理,model会留有一个回调地址,当数据处理完成之后回调它,在本实例中UserCallback就是一个回调接口,具体实现类在Presenter层,也就是说数据处理完成之后会传递给Presenter层
public class UserModel {
private UserCallback mUserCallback;
private Map<String,String> mUserMaps;
private Handler mHandler;
/**
*
* @param userCallback 回调地址,当数据处理完成之后调用这个接口
*/
public UserModel(UserCallback userCallback) {
mUserCallback = userCallback;
mUserMaps=new HashMap<>();
mHandler =new Handler(Looper.getMainLooper());
mUserMaps.put("user1","123456");
mUserMaps.put("user2","12345");
mUserMaps.put("user3","1234");
}
public void userLogin(final String name, final String pass){
/**
* 模拟延时操作,2秒后调用UserCallback接口,回传数据
*/
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (mUserMaps.containsKey(name) && mUserMaps.get(name).equals(pass)){
UserBean bean =new UserBean(name,pass,20);
mUserCallback.onSuccess(bean);
}else {
Exception exception =new Exception("用户名或账号错误");
mUserCallback.onFail(exception,400);
}
}
},2000);
}
}
4.MainActivity
public class MainActivity extends AppCompatActivity implements UserView ,View.OnClickListener {
private ProgressDialog mProgressDialog;
private EditText mUserText;
private EditText mUserPass;
private Button mLoginBtn;
private UserPresenter mUserPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mUserPresenter=new UserPresenter(this);
initView();
initEvents();
}
private void initEvents() {
mLoginBtn.setOnClickListener(this);
}
public void initView () {
mUserText = (EditText) findViewById(R.id.userName);
mUserPass = (EditText) findViewById(R.id.userPass);
mLoginBtn = (Button) findViewById(R.id.loginBtn);
}
@Override
public void onLogin() {
mProgressDialog =new ProgressDialog(this);
mProgressDialog.show();
}
@Override
public void loginSuccess(UserBean bean) {
Toast.makeText(this, "登录成功,年龄"+bean.getAge(), Toast.LENGTH_SHORT).show();
}
@Override
public void loginFail(Exception e, int code) {
if (mProgressDialog!=null){
mProgressDialog.dismiss();
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.loginBtn:
if (getUserPass().length()==0 || getUserText().length()==0){
Toast.makeText(this, "请输入账号或密码", Toast.LENGTH_SHORT).show();
return;
}
mUserPresenter.userLogin(getUserText(),getUserPass());
break;
}
}
private String getUserText(){
return mUserText.getText().toString();
}
private String getUserPass(){
return mUserPass.getText().toString();
}
}
5.XML布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:background="#ffffff"
tools:context=".MainActivity">
<LinearLayout
android:layout_margin="15dp"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:textColor="#616161"
android:id="@+id/userName"
android:inputType="text"
android:background="@drawable/shape_editview"
android:layout_width="match_parent"
android:layout_height="55dp" />
<EditText
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:textColor="#616161"
android:layout_marginTop="8dp"
android:id="@+id/userPass"
android:inputType="textPassword"
android:background="@drawable/shape_editview"
android:layout_width="match_parent"
android:layout_height="55dp" />
<Button
android:layout_marginTop="8dp"
android:textColor="#ffffff"
android:textSize="19sp"
android:background="@drawable/shape_login_btn"
android:text="登录"
android:id="@+id/loginBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
6.两个shape
shape_editview.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="30dp"></corners>
<solid android:color="#f7f5f5"></solid>
</shape>
shape_login_btn.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<corners android:radius="100dp"></corners>
<solid android:color="#03a9f4"></solid>
</shape>
</item>
<item android:state_pressed="false">
<shape>
<corners android:radius="100dp"></corners>
<solid android:color="#0a9ddf"></solid>
</shape>
</item>
</selector>
以上就是MVP模式得简单实现.一定要多加练习,才能体会掉MVP得优点
Android设计模式——MVP的更多相关文章
- Android MVC MVP
从.NET的宠物商店到Android MVC MVP 1 一些闲话 记得刚进公司的时候,我们除了做常规的Training Project外,每天还要上课,接受各种技术培训和公司业务介绍.当时第一次 ...
- Android设计模式系列
http://www.cnblogs.com/qianxudetianxia/category/312863.html Android设计模式系列(12)--SDK源码之生成器模式(建造者模式) 摘要 ...
- Android开发MVP模式解析
http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html 在开发Android应用时,相信很多同学遇到和我一样的情况,虽然 ...
- Android设计模式(五岁以下儿童)--简单工厂模式
1.面试的时候问这个问题: 在ListView 的item小程序.很多不同的显示风格.或者是,为了更好地维护,不同的样式,应该怎么做? 我一下就想到的是工厂的模式,利用project,编写ViewFa ...
- Android 设计模式之MVC模式
说到Android设计模式的MVC模式,估计很多人都是比较熟悉了,这里深入了解一下MVC到底是怎么回事,以ListView为例子讲解. 一.深入理解MVC概念 MVC即Model-View-Contr ...
- Android开发 MVP模式的规范记录(个人总结)
前言 首先,这篇文章不在讲解什么是mvp模式,如果需要请自行搜索mvp模式文章了解.这个文章里我只记录mvp模式的创建和mvp各自层的界限.另外这个博客属于个人使用mvp模式后一些经验总结与记录.并不 ...
- android的MVP模式
MVP简介 相信大家对MVC都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型. ...
- 经常使用的android设计模式
一般来说,经常使用的android设计模式有下面8种:单例.工厂.观察者.代理.命令.适配器.合成.訪问者. 单例模式:目的是为了让系统中仅仅有一个调用对象,缺点是单例使其它程序过分依赖它,并且不 ...
- android基于MVP小说网络爬虫、宝贝社区APP、仿虎扑钉钉应用、滑动阴影效果等源码
Android精选源码 android宝贝社区app源码 android仿Tinder最漂亮的一个滑动效果 android仿滴滴打车开具发票页,ListView粘性Header Android基于MV ...
随机推荐
- Replace Type Code With Class和Replace Type Code With Subclass和Replace Type Code With State/Strategy
周末闲来写写看书总结,今天写<重构>中的3个重要手法,分别是Replace Type Code With Class.Replace Type Code With Subclass和Rep ...
- PHP的date 函数
<!DOCTYPE html> <html> <body> <?php echo "今天是 " . date("Y/m/d&qu ...
- php基础篇:echo 与 print 的区别
在实际使用中, print 和 echo 两者的功能几乎是完全一样.可以这么说,凡是有一个可以使用的地方,另一个也可以使用.但是,两者之间也还是一个非常重要的区别:在 echo 函数中,可以同时输出多 ...
- 数据结构之 图论---图的深度遍历( 输出dfs的先后遍历序列 )
图的深度遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 请定一个无向图,顶点编号从0到n-1,用深度优先搜索(DFS),遍历并输出.遍历时,先遍历节点编 ...
- HDU3507 Print Article —— 斜率优化DP
题目链接:https://vjudge.net/problem/HDU-3507 Print Article Time Limit: 9000/3000 MS (Java/Others) Mem ...
- ap和路由器有什么区别 ap和路由器的区别介绍【图文】
现在能够摆脱网线限制能够自由方便上网的WiFi和无线网络也来越流行,很多酒店.饭店.宾馆.办公楼等地方都会提供无线网络.而能够提供无线网络的设备有很多,现在我们介绍的是无线ap和无线路由器.那么,ap ...
- 应用程序启动器 “sublime_text.desktop“ 还没有被标记为 信任。如果您不知道这个文件的来源,那么启动它可能会不安全。解决sublime在ubuntu中不支持中文输入问题。
1.下载 git clone https://github.com/lyfeyaj/sublime-text-imfix.git 2.进行一些处理 cd ~/sublime-text-imfix su ...
- codeforces 690C2 C2. Brain Network (medium)(bfs+树的直径)
题目链接: C2. Brain Network (medium) time limit per test 2 seconds memory limit per test 256 megabytes i ...
- I.MX6 Android /data 目录内容
/**************************************************************************** * I.MX6 Android /data ...
- 【扬中集训Day6T1】 白日梦
[题目描述] 白日梦 (daydream.c/cpp/pas) 时间限制: 1 s 空间限制: 256 MB 题目描述 SR需要相当大的睡眠量 某日,他做了一个奇怪的梦,他梦见自己成为了怪物猎人,为 ...