各位亲爱的小伙伴,有没有想我啊,我胡汉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模式的更多相关文章

  1. Java(Android)编程思想笔记03:在Android开发中使用MVP模式

    1. MVP模式简介: MVC模式相信大家肯定是比较熟悉的:M-Model-模型.V-View-视图.C-Controller-控制器. MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M- ...

  2. 转:Android开发中的MVP架构(最后链接资源不错)

    Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...

  3. Android开发之初识Camera图像采集

    /* * Android开发之初识camera图像采集 * 北京Android俱乐部群:167839253 * Created on: 2011-8-24 * Author: blueeagle * ...

  4. CSharp程序员学Android开发---1.初识AndriodIDE,掌握工具使用

    最近公司组织项目组成员开发一个Android项目的Demo,之前没有人有Andoid方面的开发经验,都是开发C#的. 虽说项目要求并不是很高,但是对于没有这方面经验的人来说,第一步是最困难的. 项目历 ...

  5. 转: Android开发中的MVP架构详解(附加链接比较不错)

    转: http://www.codeceo.com/article/android-mvp-artch.html 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解M ...

  6. 设计模式笔记之二:Android开发中的MVP架构(转)

    写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn ...

  7. 在Andoid开发中使用MVP模式来解耦,增加可测试性

    by Jeff Angelini posted on 7/20/2011 2:35:00 PM 将应用程序UI的表现从Ui的逻辑中分离是一个好的想法.这种分离减少了代码耦合,代码更加干净, 甚至可以有 ...

  8. Android开发之---Activity启动模式

    在Android开发中,启动一个新的activity我们可以使用startActivity或startActivityForResult,Android系统使用栈的方式来管理一个APP的页面显示与保存 ...

  9. Android的一种MVP模式框架

    今天给大家分享的是一种将view的初始化和逻辑与activity分离的架构,采用的是mvp模式.但令人遗憾的是,这仅仅是一个新的思路,我在实际使用中发现其并不能完全将UI逻辑与activity分开,所 ...

随机推荐

  1. 基于无域故障转移群集 配置高可用SQLServer 2016数据库

    基于上次的文章搭建的环境,可以在这里:http://www.cnblogs.com/DragonStart/p/8275182.html看到上次的文章. 演示环境 1. 配置一览 Key Value ...

  2. 将luarocks整合进openresty

    缘由 随着功能需求的深入, openresty领域的包已经不够用了, 需要lua领域本身累积的库, 也就是luarocks. 本文讲解了windows 10桌面和ubuntu server两套系统的方 ...

  3. android 小项目------黑名单app

    周一的时候,同事在群里问到了黑名单功能,他说网上都没有找到一个完整的,记得谁说过一句,当都没有做过的时候,这就是机会.这几天公司事比较多,只能晚上抽时间写写,直到今天才完整的做出来. 具体效果的话大家 ...

  4. 理解性能的奥秘——应用程序中慢,SSMS中快(5)——案例:如何应对参数嗅探

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(4)--收集解决参数嗅探问题的信息 首先我们需要明白,参数嗅探本身不是问 ...

  5. [Python]print vs sys.stdout.write

    之前只是在项目中看到过,没怎么注意,正好跟对象一起看python学习手册,看到了这个部分于是来研究下. python版本 2.7.x os  win7 print  一般就是执行脚本的时候,把信息直接 ...

  6. SQLite 分离数据库(http://www.w3cschool.cc/sqlite/sqlite-detach-database.html)

    SQLite 分离数据库 SQLite的 DETACH DTABASE 语句是用来把命名数据库从一个数据库连接分离和游离出来,连接是之前使用 ATTACH 语句附加的.如果同一个数据库文件已经被附加上 ...

  7. 求链表倒数第n个元素

    提示:设置一前一后两个指针,一个指针步长为1,另一个指针步长为n,当一个指针走到链表尾端时, 另一指针指向的元素即为链表倒数第n个元素. #include <stdio.h> #inclu ...

  8. java虚拟机 jvm 方法区实战

    和java堆一样,方法区是一块所有线程共享的内存区域,用于保存系统的类信息,类的信息有哪些呢.字段.方法.常量池.方法区也有一块内存区域所以方法区的内存大小,决定了系统可以包含多少个类,如果系统类太多 ...

  9. 【移动开发】startForeground()让服务保持前台级别

    最近在使用android 4.1系统的时候,发现在手机休眠一段时间后(1-2小时),后台运行的服务被强行kill掉,有可能是系统回收内存的一种机制,要想避免这种情况可以通过startForegroun ...

  10. 6. React 表单使用介绍

            表单是前端页面中非常重要也是非常常用的一个内容,react 也在表单方面进行了很多封装,让开发者可以方便快捷地在 react 组件中使用表单.下面介绍如何在组件中正确的使用表单,从而可 ...