一:序言
2016年安卓热门词汇MVP,RxJava,Retrofit。时隔一年这些框架依然是很常用的,现在来把这几个关键词整合起来,搭建一个快速开发框架。。。
二: MVP是什么?
对于一些刚学安卓的朋友们应该还不是太熟悉,我们先来温习一下吧!
这张图可以说是看烂了,这张图对于懂了点MVP的人可以说是把中间几个字去掉,都能一眼看穿。这张图到底是什么意思呢?
举个例子:
需求:需要点击一个按钮通过访问网络获取一条数据展示在页面上
普通做法:
一个Activity中写一个方法访问网络获取数据,点击按钮调用它,然后获取数据完成了再拿到对应的控件设置数据,完事了。。。
MVP:
在图中有三个模块view(界面),presenter(控制层),model(数据源)。他们在这个需求中需要做什么呢?
view(界面):显示数据
presenter(控制层):1.通知model我要取数据 2.取到了数据再传递给view
model(数据源):访问网络获取数据
它的过程是这样的,
- view告诉presenter我要数据
- presenter告诉model我要数据
- model访问网络得到了数据再通知presenter给你我取到的数据
- presenter 处理好数据 再把数据传递给view
- 最后view显示出来用户可以观看。
有些人说这不是脱了裤子放屁啊?一点代码能写完的东西为啥分了这么多东西?
这确实有点复杂,在面向对象中有几个原则 单一职责原则,开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,合成复用原则,迪米特法则。这我就不一一介绍了,自行百度。。普通做法中一个Activity即有访问网络,又有更新界面,第一条单一职责原则就违背了,然而在mvp中view只做和界面相关的事情。
再者一个Activity中如果逻辑太多了。一个Activity几千行代码,逻辑判断,更新界面,查询数据库,访问网络,如果第二个人需要修改,怎么看??
这时候再看看mvp 逻辑在P里面一个类,数据在Model层,界面相关的在V层。清晰明了,也方便单元测试。
程序猿如果不最求代码质量,那和咸鱼有什么区别?
三: RxJava2+Retrofit2整合
1.玩框架第一步compile :
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2.创建service
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
单独使用retrofit是返回call,配合RxJava这里我们返回Observable
3.封装一个工具类
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
4.使用
我们整合好了,最后我们看下怎么使用吧!访问个网络获取一个数据
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
好我们来分析一下,
- 首先先获得一个retrofitService对象
- 然后调用test接口。
- 访问网络在子线程
- 在访问网络的时候显示等待对话框,将这个请求加入CompositeDisposable中(在basePresenter封装了统一管理的方法,调用addDisposable(disposable);最后Activity关闭,取消所有网络请求,防止内存泄漏)
- 将网络获取的数据转换成你需要的数据
- 线程卡点结果返回主线程
- 订阅得到数据更新界面,处理错误信息
RxJava2+retrofit2就是这么简单封装好了一条线路下来非常清晰。没用过的朋友看下有可能一脸懵逼,不过没关系,你只要拿着我的项目看下就能懂了。
四: 打造MVP
先看下我们的成果里面有什么东西吧!没错 就是下面几个类就ok
五:分析
好我们来分析一下mvp
1.view需要找presenter拿数据,那么view里面需要一个presenter对象。
2.presenter需要给view数据,那么presenter也需要一个view对象。
3.model层访问网络使用RxJava+retrofit,数据回调给presenter(后面分析)
思考
所有的view里面都需要什么操作呢? 所有的presenter里面都需要什么操作呢?
暂时在我的需求中view和presenter只有如下这么几个功能,当然,如果你还有其他的功能可以再加上去。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
五:接下来编写view和presenter的实现类
由于每一个view都对应不同的presenter。当然对应的每个presenter也同样对应一个view。所有我们使用接口和泛型来封装了。
所以我们先看下代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 创建activity中泛型传入相应的view接口,presenter中泛型传入相应的presenter接口
activity中onCreate中初始化presenter,onDestroy中调用detach,将presenter中正在执行的任务取消,将view对象置为空。
presenter中通过构造传递参数。将view的实例传递进入presenter
六:使用
好的接下来我们来使用一下吧
首先我们先来个简单的需求:
打开一个页面请求网络获取数据,将数据显示在界面上
创建Contact管理接口
首先先思考view需要设置数据所有view中需要一个setData方法
presenter需要去访问网络所以需要一个getData方法。代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
创建Activity和presenter
创建一个Activity继承BaseActivity它的泛型对应presenter的接口。实现对应的view接口
创建一个TestPresenter继承BasePresenterImpl,泛型对应view的接口。并实现对应的presenter接口
代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
七:分析
好了相信大部分朋友看了代码都看懂了,简要的分析一下过程吧
- 创建对应的类,实现对应的方法
- Activity中只有一个recyclerView初始化它。
- 在onCreate中调用presenter中的getData()方法
- 在presenter中使用RxJava2+retrofit2访问网络。获取数据返回给view
- view拿到数据更新界面
转载地址:http://blog.csdn.net/a_zhon/article/details/77914012源码地址:https://github.com/azhon/Mvp-RxJava-Retrofit