引子
总算有时间总结一下MVP代码框架,顺便把最近看到的消息总线RxBus 也整合到一起 。
本文内容主要是 本人对MVP代码框架的理解,以及 一种比较好理解的自定义RxBus的写法。
最后将会奉上Demo的Github地址;
MVP代码架构
Model层,纯粹的数据层,核心代码是 数据的获取和变更(即增删改查),数据来源可以是网络请求,本地文件(xml,json),本地数据库(sqlite);通常,数据变更或获取逻辑 执行完毕之后,会 通过返回值,或者 实参赋值的方式告知P层;(纯java)
View层,纯粹的视图UI层,核心代码,是 界面组件的初始化,UI变更的函数等UI逻辑,不涉及任何的业务逻辑;(java+layout.xml)
Presenter层,纯粹的业务逻辑层,没有任何UI变更代码,没有任何 数据获取或变更的代码,但是,可以调用UI变更的函数,可以调用数据获取或变更的函数。(纯java)
RxBus消息总线
由于近期是第一次接触,虽然可以将RxBus应用到我写的框架中,但是仍然理解不够深刻。
所以原理方面就不在这里细说了,下面列出RxBus相关的基本概念;
ReactiveX:专注于异步编程和控制可观察数据和事件流的API,它组合了观察者模式,迭代器模式,函数式编程的优秀思想;
RxJava: ReactiveX的java实现;
RxJava作用 :异步编程,可以很方便解决任何android组件之间的消息传递,比 startActivityForResult的方式更好。(但是理论上不仅仅是组件之间,任意两个对象之间都可以用这种方式传递消息)
核心类: Observable(观察者) Subscriber(订阅者);
Observable : 发出数据流或者事件的类,
Subscriber : 对这些发出的 items (数据流或者事件)进行处理(采取行动)的类。
RxBus: 我们用自己的代码实现的 异步编程消息总线;(所以每个人写的都可能不同);
下面说一下我自己写的RxBus库里面用到的技术点:
1-线程安全的单例模式(同步代码块+多重判空+volatile关键字); 消息总线类,在项目中只能存在一个,才能保证消息的统一分发
2-线程安全的CopyOnWriteArraySet集合类
3-注解函数+反射调用,实现“订阅者”执行函数的自动调用
Demo整体代码框架一览
按照标记来:
1-数据层Model全部代码
2-逻辑层Presenter全部代码
3-视图层View的java代码
4-视图层View的xml配置
5-将消息总线 封装到一个Android-library中
6-注解接口,用于让RxBus识别出回调方法并且执行
7-反射调用的辅助类,由于是完全独立的功能,并没有和RxBus形成绑定关系,所以单独提出来
8-RxBus的接口类
9-RxBus实现类
然后MVP层的详细结构:
1-数据Model层的接口规范,使用了泛型接口,方便对接不同的业务
2-业务Presenter层抽象类,使用了泛型接口,并且将公共的函数提取到了抽象类中,最大程度精简 业务代码;
3-视图View层接口规范,要求所有 需要对接P层的组件都要实现这个IView接口。
4-业务1,以学校为案例,这个leader是领导;
5-业务2,学生
6-业务3,老师
7-P层实现类
8-业务1的Fragment
9-业务2的Fragment
10-业务3的Activity
最终效果
OK,任意组件之间的信息互通,用过这种方式,eazy。
Github地址
https://github.com/18598925736/MVP-RxBus