如何实践MVP+RxJava+Retrofit(1)
为了准备春招,整理了some流行技术,大概是去年5,6月份开始在知乎上看到,后面了解到google早在github上开源了Android开发三种开发模式:MVC ,MVP,MVVM,其中关于这三种对于具体需求来说有不同变体。(吼吼~~有不对的地方请指出==)
现在要介绍的是MVP+RxJava+Retrofit这种开发模式,那进入正题前,需要了解下前面的三个技术。别着急,一个一个来说?
MVP模式介绍:
很明显它与MVC模式只有一字之差,如果想快速了解一样东西,比较其特征是最好的方式了。接下来,从下面几方面来说明:
在原理结构上看:
1MVC-通过控制层C读取视图层V的数据,控制用户输入,向模型层发送数据。其中,视图层根据模型数据创建。视图层与模型层存在强耦合。
2MVP-视图层V通过P(Presenter)调用模型层M的返回数据返回给视图层V使用。视图层与模型层没有直接联系,降低耦合性,也有利于测试。
在应用角度上看:MVC侧重业务逻辑简单,小项目,搭建项目比较快速,但不利于分层测试;而MVP的话侧重大中型的项目,业务逻辑复杂,搭建项目也快,业务逻辑清晰,利于测试。
RxJava是啥?
放上一段官网精辟的定义:一个在Java VM上使用可观测序列的异步的,事件的库程序。
这个概念是不是云里雾里的?总结两个字功能概述:异步。那它和一般的handler与AsyncTask异步机制有啥不同?
使用RXjava进行异步操作你会发现不管多复杂的逻辑,Rxjava都能清晰易懂的写出来。
原理上来说:采用了设计模式观察者模式的变体,为什么这么讲?其实,一般的观察者模式是观察者时时看被观察者,如果被观察者出现符合条件动作,那么观察者立即做出反应。Rxjava采用订阅的方式,告诉被观察者:我需要你的某某状态,你要在它变化的时候通 知我。
典型的例子是事件点击监听器 OnClickListener
,先填上一段代码,很熟悉对吧。对设置 OnClickListener
来说, View
是被观察者, OnClickListener
是观察者,二者通过 setOnClickListener()
方法达成订阅关系,订阅之后用户点击按钮的瞬间,Android Framework 就会将点击事件发送给已经注册的 OnClickListener
。
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(),"button",Toast.LENGTH_LONG).show(); } });
RxJava 的观察者模式
RxJava 有四个基本概念:Observable
(可观察者,即被观察者)、 Observer
(观察者)、 subscribe
(订阅)、事件。Observable
和 Observer
通过 subscribe()
方法实现订阅关系,从而 Observable
可以在需要的时候发出事件来通知 Observer
。
与传统观察者模式不同, RxJava 的事件回调方法除了普通事件 onNext()
(相当于 onClick()
/ onEvent()
)之外,还定义了两个特殊的事件:onCompleted()
和 onError()
。
onCompleted()
: 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的onNext()
发出时,需要触发onCompleted()
方法作为标志。onError()
: 事件队列异常。在事件处理过程中出异常时,onError()
会被触发,同时队列自动终止,不允许再有事件发出。- 在一个正确运行的事件序列中,
onCompleted()
和onError()
有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted()
和onError()
二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。 -
RxJava 的观察者模式大致如下图:
关于Retrofit的用法
Retrofit与okhttp共同出自于Square公司,Retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了,Retrofit采用Restful简洁的接口设计,让M层清晰访问数据,降低耦合度。
开发工具使用AndroidStudio通过Gradle引入:
compile 'com.squareup.retrofit2:retrofit:2.2.0'
需要注意:Retrofit 最低要求是 Java 7 或者 Android 2.3。
参考:rxjava福利: http://gank.io/post/560e15be2dca930e00da1083
retrofit用法: http://square.github.io/retrofit/#api-declaration