各位亲爱的小伙伴,有没有想我啊,我胡汉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

  1. public class WifiBean {
  2. private String mSsid = "";
  3. private String mComment = "";
  4. private String mKey = "";
  5. public String getmSsid() {
  6. return mSsid;
  7. }
  8. public void setmSsid(String mSsid) {
  9. this.mSsid = mSsid;
  10. }
  11. public String getmComment() {
  12. return mComment;
  13. }
  14. public void setmComment(String mComment) {
  15. this.mComment = mComment;
  16. }
  17. public String getmKey() {
  18. return mKey;
  19. }
  20. public void setmKey(String mKey) {
  21. this.mKey = mKey;
  22. }
  23. }

Model层,主要用于数据的获取或者其他增删操作

  1. public interface IWifiModel {
  2. ArrayList<WifiBean> getWifis();
  3. void addWifi(WifiBean wifiBean);
  4. void delWifi(WifiBean wifiBean);
  5. }
  6. public class WifiModelImpl implements IWifiModel {
  7. @Override
  8. //这里模拟实现从手机读取出wifi的密码
  9. public ArrayList<WifiBean> getWifis() {
  10. ArrayList<WifiBean> list = new ArrayList<>();
  11. for(int i = 0 ;i<5;i++) {
  12. list.add(new WifiBean());
  13. }
  14. return list;
  15. }
  16. @Override
  17. public void addWifi(WifiBean wifiBean) {
  18. }
  19. @Override
  20. public void delWifi(WifiBean wifiBean) {
  21. }
  22. }

View层,主要表明view要做哪些事情

  1. public interface IWifiView {
  2. void setListViewData(ArrayList<WifiBean> list);
  3. void showSnackbar(View view);
  4. }

因为Activity即为View,所以让Activity实现这个接口,并且实现view的方法。

  1. public class MainActivity extends AppCompatActivity implements IWifiView{
  2. private ListView mListView;
  3. private WifiAdapter mWifiAdapter;
  4. //包含一个presenter
  5. private WifiPresenterImpl mWifiPresenter;
  6. private Toolbar mToolbar;
  7. private FloatingActionButton mFAB;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. //initViews()方法仍然不变
  13. initViews();
  14. //初始化一个Presenter
  15. mWifiPresenter = new WifiPresenterImpl(this);
  16. //将需要初始化的东西交由Presenter处理
  17. mWifiPresenter.onCreate();
  18. }
  19. private void initViews() {
  20. mToolbar = (Toolbar) findViewById(R.id.toolbar);
  21. setSupportActionBar(mToolbar);
  22. mListView = (ListView) findViewById(R.id.listView);
  23. mFAB = (FloatingActionButton) findViewById(R.id.fab);
  24. mFAB.setOnClickListener(new View.OnClickListener() {
  25. @Override
  26. public void onClick(View view) {
  27. //处理用户的事件
  28. mWifiPresenter.showSnackbar(view);
  29. }
  30. });
  31. }
  32. //实现view接口的方法,为listview设置数据
  33. @Override
  34. public void setListViewData(ArrayList<WifiBean> list) {
  35. mWifiAdapter = new WifiAdapter(this,list);
  36. mListView.setAdapter(mWifiAdapter);
  37. }
  38. //实现view接口的方法,弹出Snackbar
  39. @Override
  40. public void showSnackbar(View view) {
  41. Snackbar.make(view, "侧滑有惊喜哦!", Snackbar.LENGTH_LONG)
  42. .setAction("Action", null).show();
  43. }
  44. }

最后是Presenter ,用来处理Model和View

  1. public interface IWifiPresenter {
  2. //交付过来的onCreate
  3. void onCreate();
  4. }
  5. public class WifiPresenterImpl implements IWifiPresenter{
  6. private IWifiView mWifiView;
  7. private IWifiModel mWifiModel;
  8. public WifiPresenterImpl(IWifiView wifiView) {
  9. //传入View
  10. mWifiView = wifiView;
  11. //初始化Model
  12. mWifiModel = new WifiModelImpl();
  13. }
  14. //私有方法,在onCreate里调用,用来初始化listview数据,presenter操作model和view
  15. private void setWifiDatas() {
  16. mWifiView.setListViewData(mWifiModel.getWifis());
  17. }
  18. //交付过来的onCreate()周期
  19. @Override
  20. public void onCreate() {
  21. setWifiDatas();
  22. }
  23. //让Snackbar显示
  24. public void showSnackbar(View view) {
  25. mWifiView.showSnackbar(view);
  26. }
  27. }

好了,基本上简单的展示写完了,可以看到思路逻辑非常的清晰。这也是我对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. Python中capitalize()与title()的区别

    capitalize()与title()都可以实现字符串首字母大写.主要区别在于:capitalize(): 字符串第一个字母大写title(): 字符串内的所有单词的首字母大写 例如: >&g ...

  2. Python3 XML解析

    什么是XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 你可以通过本站学习XML教程 ...

  3. Dynamics CRM2016 Web API获取实体元数据Picklist属性的Text&Value

    通过组织服务中获取实体picklist字段的text和value可以通过RetrieveAttributeRequest实现,但在使用web api的今天该怎么实现,本文即来一探究竟,本篇基于SDK中 ...

  4. Lua语言模型 与 Redis应用

    Lua语言模型 与 Redis应用 标签: Java与NoSQL 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis. 本篇博客主要介绍了 Lua 语言不一样的设计 ...

  5. Android简易实战教程--第四十四话《ScrollView和HorizontalScrollView简单使用》

    一.ScrollView 由于手机屏幕的高度有限,当普通布局放不下现实和的内容时,ScrollView视图(滚动视图)就会派上用场,因为数据可以往下滚动显示. 二.HorizontalScrollVi ...

  6. Spark核心类:弹性分布式数据集RDD及其转换和操作pyspark.RDD

    http://blog.csdn.net/pipisorry/article/details/53257188 弹性分布式数据集RDD(Resilient Distributed Dataset) 术 ...

  7. Compass实战 站内搜索

    今天早上打算对这两天学习的Lucene以及Compass总结一下,想来想去,还是写个小项目来验证最好了.于是就有了今天的这篇文章.难易程度适合对于Compass或者Lucene刚入门的童鞋,大牛看到后 ...

  8. pandas小记:pandas数据输入输出

    http://blog.csdn.net/pipisorry/article/details/52208727 数据输入输出 数据pickling pandas数据pickling比保存和读取csv文 ...

  9. linux中exec和xargs命令的区别和优劣分析

    find的exec及ok命令 exec命令的格式为: exec command {} \; exec后面跟着的是操作命令,然后跟着{}表示每一个参数,然后空格,然后"\;".{}之 ...

  10. Java并发框架——AQS之阻塞与唤醒

    根据前面的线程阻塞与唤醒小节知道,目前在Java语言层面能实现阻塞唤醒的方式一共有三种:suspend与resume组合.wait与notify组合.park与unpark组合.其中suspend与r ...