亲情奉献:最简MVP框架

前言

听到一些童鞋抱怨MVP,所有搞了个辅助实现MVP的小东西,叫MvpFrame。还不了解MVP的先看《Google原味mvp实践》。主要的功能如下

  • 省代码。不能偷懒的框架都是耍流氓,当然像Rx系列这样可以简化逻辑的也是正经人。
  • 不依赖其他库。不跟Retrofit,Rxjava等等耦合,只是纯粹的辅助MVP的实现。
  • 小,只有8k。可以在任意最小业务单元使用,即使之前业务没使用,或者之后不想使用都没关系。
  • M,V,P中各个层级的实例托管。
  • 维护M,V,P中对其他层的引用,并保证实例可回收。
  • 在工程任意位置获取MVP中的实例。

开源地址是

https://github.com/wolearn/MvpFrame

怎么用

可以把上面工程中的mvpframelib作为Android Lib引入,或者直接复制java文件也可以。我简单解释下还是我常用那个登陆的例子。先看目录结构。

初始化

在Application中调用

Mvp.getInstance().init(this);

规划好view和presenter的接口。

用一个契约类来定义需要的方法。之前有童鞋问我,这个接口写好烦,能不能不写。肯定不能。我能想到的理由有三点

  • 依赖倒置原则。高层模块和底层模块之间不能直接依赖,而是应该依赖其接口
  • 保证其可测性
  • 面向接口编程的前期设计感

View层

可以支持Activity和Fragment,Activity继承MvpActivity,Fragment继承MvpFragment。

  • 注意MvpActivity<LoginPresenter>,在继承的时候要通过泛型确定Presenter层的具体类型,一定要写。
  • getBaseView方法返回的是IView类型,如果是当前Activity实现的话,直接返回this即可。
  • mPresenter可以直接使用,不用声明和实例化

Presenter层

Presenter继承MvpPresenter实现即可。

  • 注意MvpPresenter<LoginHttp, LoginContract.View>的泛型,要确定Model的具体实现和IView。
  • IView的回调接口对象通过getIView()方法获取
  • mModel指向泛型中确认的LoginHttp对象,可以直接使用,不用声明和实例化
  • mContext是一个ApplicationContext的引用

Model层

数据的来源一般有三个:DB,NET,Cache。看个图

之前有童鞋说,业务过程很烦,要搞个UseCase文件,然后又要搞个Repository文件,最后搞个HttpLogin,因为登录本来就只是要跟服务端确认,前面2个文件基本都是透传。是不是一定要这么死板呢?当然不是,结构可以根据业务的复杂度做调整的。比如我这里登录就是直接让HttpLogin继承MvpModel, 直接跟P层交互。

如果你当前业务是只跟DB打交道,也可以让LoginDB继承MvpModel,然后在P层的泛型中确认类型即可。

其他任意位置获取M,V,P实例

默认通过以下API获取的唯一实例,传入为实例的class类型

Mvp.getInstance().getPresenter(); Mvp.getInstance().getModel(); Mvp.getInstance().getView();

getPresenter 和 getModel 的实例默认会创建,getView 要确定Activity或者Fragment已经创建,否则可能为null。

后记

建议以文件的形式引入,方便依据工程业务做定制化。喜欢请帮忙戳喜欢,有问题欢迎评论。

原文发布于微信公众号 - 非著名程序员(non-famous-coder)

原文发表时间:2016-09-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习从入门到成神

2017年阿里内推一面面经(不断更新)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

40110
来自专栏13blog.site

Mybatis-Generator生成Mapper文件中<if test="criteria.valid">的问题解答

写在前面 由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去解决,有的是把问题留在项目的issue里提出,有的是在我的私人博客里留言...

35860
来自专栏大内老A

你知道Unity IoC Container是如何创建对象的吗?

Unity是微软P&P推出的一个开源的IoC框架,最新的官方版本是2.0。Unity之前的版本建立在一个称为ObjectBuild的组件上,熟悉EnterLib...

21180
来自专栏Seebug漏洞平台

PWN学习之house of系列(一)

作者:Hcamael@知道创宇404实验室 准备一份house of系列的学习博文,在how2heap上包括下面这些: house of spirit hous...

450130
来自专栏owent

Rust的第二次接触-写个小服务器程序

蛮久前入门了一下 Rust 语言。它的设计模型非常地吸引C/C++的开发者。但是学习语言嘛还是要练习一下,之前也用它给我们项目写了个命令行小工具。这回拿来写个小...

1.5K30
来自专栏Crossin的编程教室

一些常见的新手问题

本账号开设至今,回答的各种问题,没有一万也有八千了。今天挑了其中曝光率较高的一些问题,跟各位分享,供入门不久和新关注的同学参考。 1. 我是零基础,如何开始学习...

31190
来自专栏FreeBuf

如何绕过Windows 10的CFG机制

前言 本文来源于我在2016年7月的研究结论,由于各种原因现在才能发布。2016年6月,Theori曾发表了一篇关于MS16-063中修补了的IE漏洞分析,文中...

23760
来自专栏腾讯Bugly的专栏

Android中导致内存泄漏的竟然是它----Dialog

一. 内存泄漏的 Bug 猛增 最近在 App 进行 mokey 测试的时候检测到一些内存泄漏问题。在前天的测试中,楼主一瞬间收到了4个这样的 Bug 单,瞬...

71670
来自专栏MelonTeam专栏

ViewPager与Fragment那些事儿

本文会讲解: 1.viewPager与Fragment使用过程中,偶现页面混乱问题的可能原因以及解决方案。 2.notifyDataSetChange方法在v...

22880
来自专栏机器学习实践二三事

Theano的一个关于signal,signal/conv,signal/downsample的错误

安装了Theano和keras之后,准备走段代码出错了,大概意思是: “Theano is missing signal”,就是说signal模块找不到,我跑...

26380

扫码关注云+社区

领取腾讯云代金券