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分开,所 ... 
随机推荐
- IDEA中Git的使用
			工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 场景三:小 ... 
- ToolBar控件详解
			ToolBar控件详解 在Activity中添加ToolBar 1.添加库 dependencies { ... compile "com.android.support:appcompat ... 
- HA机制下的Hadoop配置
			[版权申明:本文系作者原创,转载请注明出处] 文章出处:http://www.cnblogs.com/sdksdk0/p/5585355.html 作者: 朱培 ID:sdksdk0 ----- ... 
- PGM:部分有向模型之条件随机场与链图模型
			http://blog.csdn.net/pipisorry/article/details/52529287 贝叶斯网与马尔可夫网 [PGM:无向图模型:马尔可夫网]中例3.8和例4.8显示,贝叶斯 ... 
- SpriteKit游戏开发 Challenge 2: An invincible zombie 问题的另一种解决方法
			大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 该挑战的目的是僵尸碰到敌人时,将其设置为无敌模式,具体要求如下 ... 
- Dynamics CRM2016 业务流程之Task Flow(二)
			接上篇,Page页设置完后,按照业务流程管理也可以继续设置Insert page after branch 或者 Add branch,我这里选择后者,并设置了条件,如果Pipeline Phase ... 
- 指令汇B新闻客户端开发(四) 自动轮播条
			在这个新闻客户端,我们可以看到有一个轮播页面,在这个项目中,用Handler和一个定时器来做更容易一些, 我们定义一个Handler: private Handler mHandler; 定时器的代码 ... 
- shell的追踪与调试选项
			选项: -n :不执行shell脚本,只检查语法问题.没有问题则没有输出. -v :执行shell脚本前,现将shell脚本的命令输出到屏幕上.输出一段,执行一段. -x :将使用到的所有shell脚 ... 
- Dynamics CRM Import Solution Attribute Display Name description is null or empty
			在做解决方案导入的时候遇到错误,下载错误xml信息后查询报错如下:"Attribute Display Name description is null or empty",字面意 ... 
- 查看某一职责下对应的菜单&功能&请求
			查看菜单&功能 SELECT res.RESPONSIBILITY_NAME 职责名称, menu.MENU_NAME 菜单编码, menu.USER_MENU_NAME 菜单名称, func ... 
