Android开发之初识MVP模式
各位亲爱的小伙伴,有没有想我啊,我胡汉wing又回来了。
很长一段时间没有更新博客。。原因是。。从离职回到学校以后,一直在享受最后的学生时光(打游戏).. 游戏固然很爽,但是觉得实在很荒废,于是半夜诈个尸..学习一下流行的MVP模式,就拿我刚学Android的项目“wifi密码读取器”开刀吧。。以前的代码很烂,所以来个彻底的重构…
MVP模式
mvp模式的介绍网上有很多,这里在简述一下:
MVP即 Model View Presenter, 他与MVC的区别在于在MVP里面View和Model不直接进行交互,完全交给Presenter。这样Activity就真实的成为了一个View,逻辑任务交给Presenter处理。不再是以前Activity即充当View又冲当Controller的情况。
简单来说如下图(盗来的,出自鸿洋大大这篇博客):
学习编写
简单的了解了一下MVP以后,开始拿“wifi密码读取器”开刀(wifi密码读取器是一款能够读取手机wifi密码的应用,配合万能钥匙使用更赞哦。。)
明确需求
进行第一部分的编写实现,需求如下图:
基本就是:
+ 初始化listview的内容
+ 为FloatingActionButton添加监听
代码的编写
首先,来一个实体Bean
public class WifiBean {
private String mSsid = "";
private String mComment = "";
private String mKey = "";
public String getmSsid() {
return mSsid;
}
public void setmSsid(String mSsid) {
this.mSsid = mSsid;
}
public String getmComment() {
return mComment;
}
public void setmComment(String mComment) {
this.mComment = mComment;
}
public String getmKey() {
return mKey;
}
public void setmKey(String mKey) {
this.mKey = mKey;
}
}
Model层,主要用于数据的获取或者其他增删操作
public interface IWifiModel {
ArrayList<WifiBean> getWifis();
void addWifi(WifiBean wifiBean);
void delWifi(WifiBean wifiBean);
}
public class WifiModelImpl implements IWifiModel {
@Override
//这里模拟实现从手机读取出wifi的密码
public ArrayList<WifiBean> getWifis() {
ArrayList<WifiBean> list = new ArrayList<>();
for(int i = 0 ;i<5;i++) {
list.add(new WifiBean());
}
return list;
}
@Override
public void addWifi(WifiBean wifiBean) {
}
@Override
public void delWifi(WifiBean wifiBean) {
}
}
View层,主要表明view要做哪些事情
public interface IWifiView {
void setListViewData(ArrayList<WifiBean> list);
void showSnackbar(View view);
}
因为Activity即为View,所以让Activity实现这个接口,并且实现view的方法。
public class MainActivity extends AppCompatActivity implements IWifiView{
private ListView mListView;
private WifiAdapter mWifiAdapter;
//包含一个presenter
private WifiPresenterImpl mWifiPresenter;
private Toolbar mToolbar;
private FloatingActionButton mFAB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//initViews()方法仍然不变
initViews();
//初始化一个Presenter
mWifiPresenter = new WifiPresenterImpl(this);
//将需要初始化的东西交由Presenter处理
mWifiPresenter.onCreate();
}
private void initViews() {
mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
mListView = (ListView) findViewById(R.id.listView);
mFAB = (FloatingActionButton) findViewById(R.id.fab);
mFAB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//处理用户的事件
mWifiPresenter.showSnackbar(view);
}
});
}
//实现view接口的方法,为listview设置数据
@Override
public void setListViewData(ArrayList<WifiBean> list) {
mWifiAdapter = new WifiAdapter(this,list);
mListView.setAdapter(mWifiAdapter);
}
//实现view接口的方法,弹出Snackbar
@Override
public void showSnackbar(View view) {
Snackbar.make(view, "侧滑有惊喜哦!", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
}
最后是Presenter ,用来处理Model和View
public interface IWifiPresenter {
//交付过来的onCreate
void onCreate();
}
public class WifiPresenterImpl implements IWifiPresenter{
private IWifiView mWifiView;
private IWifiModel mWifiModel;
public WifiPresenterImpl(IWifiView wifiView) {
//传入View
mWifiView = wifiView;
//初始化Model
mWifiModel = new WifiModelImpl();
}
//私有方法,在onCreate里调用,用来初始化listview数据,presenter操作model和view
private void setWifiDatas() {
mWifiView.setListViewData(mWifiModel.getWifis());
}
//交付过来的onCreate()周期
@Override
public void onCreate() {
setWifiDatas();
}
//让Snackbar显示
public void showSnackbar(View view) {
mWifiView.showSnackbar(view);
}
}
好了,基本上简单的展示写完了,可以看到思路逻辑非常的清晰。这也是我对MVP模式的一点理解和应用,光是这一点内容,就理解了好久。。。。如果有什么错误的地方,求各位拍砖,一起讨论。
欢迎关注我的博客,蟹蟹!
参考文章:
http://blog.csdn.net/knxw0001/article/details/39637273
http://blog.csdn.net/duo2005duo/article/details/50594757
http://blog.csdn.net/lmj623565791/article/details/46596109
Android开发之初识MVP模式的更多相关文章
- Java(Android)编程思想笔记03:在Android开发中使用MVP模式
1. MVP模式简介: MVC模式相信大家肯定是比较熟悉的:M-Model-模型.V-View-视图.C-Controller-控制器. MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M- ...
- 转:Android开发中的MVP架构(最后链接资源不错)
Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...
- Android开发之初识Camera图像采集
/* * Android开发之初识camera图像采集 * 北京Android俱乐部群:167839253 * Created on: 2011-8-24 * Author: blueeagle * ...
- CSharp程序员学Android开发---1.初识AndriodIDE,掌握工具使用
最近公司组织项目组成员开发一个Android项目的Demo,之前没有人有Andoid方面的开发经验,都是开发C#的. 虽说项目要求并不是很高,但是对于没有这方面经验的人来说,第一步是最困难的. 项目历 ...
- 转: Android开发中的MVP架构详解(附加链接比较不错)
转: http://www.codeceo.com/article/android-mvp-artch.html 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解M ...
- 设计模式笔记之二:Android开发中的MVP架构(转)
写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn ...
- 在Andoid开发中使用MVP模式来解耦,增加可测试性
by Jeff Angelini posted on 7/20/2011 2:35:00 PM 将应用程序UI的表现从Ui的逻辑中分离是一个好的想法.这种分离减少了代码耦合,代码更加干净, 甚至可以有 ...
- Android开发之---Activity启动模式
在Android开发中,启动一个新的activity我们可以使用startActivity或startActivityForResult,Android系统使用栈的方式来管理一个APP的页面显示与保存 ...
- Android的一种MVP模式框架
今天给大家分享的是一种将view的初始化和逻辑与activity分离的架构,采用的是mvp模式.但令人遗憾的是,这仅仅是一个新的思路,我在实际使用中发现其并不能完全将UI逻辑与activity分开,所 ...
随机推荐
- iOS多线程编程--NSOperation(转)
这篇文章写得非常不错,基础用法都涉及到了,我把文章提到的例子都写到了demo里面, 原文地址: iOS多线程--彻底学会多线程之『NSOperation』 demo下载:https://github. ...
- js数组排序,支持正反排序以及多维度排序
工作中遇到js数组排序问题,数组中存储的都是对象,于是就百度了下,利用别人的代码进行修改,最终完成可以倒序.反序,可以进行多维度排序的功能源码如下: /** * js数组排序 支持数字和字符串 * @ ...
- 1. 两数之和 LeetCode
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [, , , ], target = 因为 n ...
- 复杂和遗留的数据库schema
本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/50414652 In this chapter, we focus ...
- Linux下文件的mtime/atime/ctime研究
概述 在Linux下,对于某一个文件或文件夹时间的描述有三种:文件修改时间mtime,文件访问时间atime,文件状态改变时间ctime.在Linux下无法获取到文件的创建时间,因为根本就没有保存这个 ...
- Spark Streaming中的操作函数分析
根据Spark官方文档中的描述,在Spark Streaming应用中,一个DStream对象可以调用多种操作,主要分为以下几类 Transformations Window Operations J ...
- post插件
分享牛系列,分享牛专栏,分享牛.在项目开发中,http请求方式是最常见的了.怎么模拟http请求呢?方法有很多种,可以使用httpclient直接模拟请求,也可以使用火狐post插件方式,这个章节主要 ...
- 2016年年终CSDN博客总结
2015年12月1日,结束了4个月的尚观嵌入式培训生涯,经过了几轮重重面试,最终来到了伟易达集团.经过了长达3个月的试用期,正式成为了伟易达集团的助理工程师. 回顾一年来的学习,工作,生活.各种酸甜苦 ...
- 详解EBS接口开发之库存事务处理采购接收和退货
(一)接收&退货常用标准表简介 1.1 常用标准表 如下表中列出了与采购接收&退货导入相关的表和说明: 表名 说明 其他信息 RCV_TRANSACTIONS 采购接收事务表 事务 ...
- Xcode的playground中对于SpriteKit物理对象的更新为何无效
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 为了便于SpriteKit中物理行为的调试,我们可以借助于Xc ...