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

    Html常用标签一 <body style="background-color:red;"> Body 标签 Style 属性 background-color:red ...

  2. ABP文档笔记 - 配置、设置、版本、功能、权限

    配置 全局仅一个单例,保存一组配置信息,一般直接在模块的预启动事件中赋值or修改.没有Scope划分,无论租户还是房东亦或者用户读取的值都不会有差异.每个模块都可以扩展这个配置. 设置 它没有层级关系 ...

  3. Python3 条件控制

    if 语句 Python中if语句的一般形式如下所示: if condition_1: statement_block_1 elif condition_2: statement_block_2 el ...

  4. vue 2.0 scopedSlots和slots在render函数中的应用示例

    渲染内容为: hello from functional render scopedSlots render scopedSlots named slot of render hello from f ...

  5. OpenResty和Resis一些基本的性能配置

    Basics: 1. Ensure that you have not disabled Lua code cache: https://github.com/openresty/lua-nginx- ...

  6. Linux文件格式化与相关处理及sed工具

    http://blog.csdn.net/pipisorry/article/details/52564957 geditor, sed, ed, awk, Emacs 文本处理工具 [Linux S ...

  7. shell编程--基本格式,基本语法,运算符,expr,(()),$[]

    02/shell编程 Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell Shell也是一门编程语言."."号执行脚本时,会让脚本在调用者 ...

  8. Dynamics CRM2016 Web API之Create related entities in one operation

    本篇继续来介绍两个web api的接口,一个是"Create related entities in one operation"即在一步操作中完成主实体的创建加关联实体的创建,一 ...

  9. hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)

    数据做压缩和解压缩会增加CPU的开销,但可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,所以最好对那些I/O密集型的作业使用数据压缩,cpu密集型,使用压缩反而会降低性能. 而hive中间结果 ...

  10. 【ShaderToy】水彩画

    写在前面 好久没有更新shadertoy系列了,我万万没想到有童鞋还惦记着它...之前说过希望可以一周更新一篇,现在看来是不怎么可能了,一个月更新一篇的希望比较大(不要再相信我了...) 我把之前实现 ...