我刚又回过头来看了下上周的内容,上周是用自带的jdbctemplate 而且关键是还要在xml中进行配置各种dao我主要嫌这个麻烦,而且貌似里面的各种增删改查得自己写sql就比较麻烦。而这周的采用注解的方式可以自动建表,而且通过配置对其进行了封装,简化了很多操作。那么我又想到了最新的jpa是个啥玩意呢,该怎么用呢,还有是不是应该有模板什么的能一键生成增删改查呢?这个留到后面再说 我已经完成了后台,并新增了一个登录接口和注册接口目前自测OK。
那么现在开始客户端。先前就说了会采用mvp+retrofit+rxjava的方式。那么我先来回顾下以前我遇到的项目中数据流怎么操作的
1.我最早的项目是用httpclient封装后 继承统一接口回调的方式来实现的,通过每个activity里面写回调
2.通过传入handler配合intentservice或者线程等
3.eventbus(优点 任意地方 随时调用 缺点管理麻烦)
4.就是今天我想着重介绍的这种模式。
上面几种的传统方式 代码量少 但逻辑复杂起来也是挺复杂的,虽然我以前也会把公共方法抽出来,但有的时候写写还是挺乱的。而且有很多操作是在view里面 然后调其他公共类里面的方法去操控数据库啊 做处理啊 最后展示的这种方式。其实就是传统的MVC,即Model控制view 当数据Model发生变化 回给activity来让其改变 activity即是view 而view中又能控制control即我们各个处理数据的逻辑,control又能控制model的改变的这样一个过程。
那MVP呢简而言之 就是view和model做了分离 统一来由Presenter来进行双向控制
那么究竟是如何做到的呢?Presenter以下简称P 常用做法是往其中注入model 再暴露接口给view继承以便通知view即activity对应做出更改。简单来说就是这么简单的啊,没有任何其他的复杂难度,但是为什么还要用一个中间组件contact来进行关联呢?这么做的好处是什么呢?官方写的是:使用契约类来统一管理view与presenter的所有的接口,这种方式使得view与presenter中有哪些功能,一目了然,维护起来也很方便。可这么做的缺点就是对应任意一个类 复用好像就很困难了,不管是采用设置多个presenter还是或者采用接口继承的方式 两个页面 除非用接口的方式可插拔 不然我觉得还是挺困难的。
目前大部分都市采用抽象类 写base 然后继承。我看了一些封装,目前使用的是android fire 开源的这种。分析了其中的流程如下,如有不对的可以提醒我。传统做法presenter在onresume里面 attach 在ondestroy中detach 可以防止内存泄露。这里面他是这么封装的
他这么封装 是可以兼容传统app和mvp的 如果你不想使用mvp模式 直接继承base后面不带泛型自然tutils取不到对应参数就不会给P赋值context,给P赋值context我想也是为了更方便的操纵view吧。那么究竟申明了activity中的p和model后他们是怎么关联的,我们往下看。
通过initpresenter方法,mPresenter.setVM(this,mModel);我们给P设置了这两个变量。那view以及数据的变化呢,难道设了这两个他们就关联了?这个时候RxJava隆重登场。
Rxjava其实就是个观察者模式。里面obsever为观察者,obervaral为被观察者,由被观察者注册观察者,然后当被观察者有变化就可以发送onnext或者自定义事件来通知观察者来进行改变。
这个里面谁是被观察者,谁是观察者呢?自然数据model是被观察者,Presenter是观察者,那么如何把model变成obervable把Presenter变成obersver呢,contact的作用就来了!
contact直接给你强制说了 model的返回是啥 view即activity中需要复写的方法是啥 以及P中要对应操作是啥。但是还是没有看到啥时候关联二者的 继续往下看具体实现。
这一下是否明白了呢,原来P中在实现各种操作的时候就用rxjava对2者进行了关联 只要数据发生了变化,就可以在回调中调用view即对应activity中的view发生变化 ,刚好retrofit可以直接将返回的结果自动转换成oberservble被观察者。
Rxjava还有个好处就是比如回给你的是个字符串你可以转化为对象 通过map或者转化城任意你需要的东西,而flatmap则可以一个Observral变为另一个oberserval 总之给人的感觉就是方便,框架介绍完了,本周的学习内容到此结束。