RxJava RxAndroid Retrofit

参考:

http://gank.io/post/560e15be2dca930e00da1083

http://blog.csdn.net/lzyzsd/article/details/45033611

a library for composing asynchronous and event-based programs using observable sequences for the Java VM

Observables(被观察者,事件源)和Subscribers(观察者、订阅)(Observer和Subscriber具有相同的角色,而且Observer在subscribe()过程中最终会被转换成Subscriber对象)

myObservable.subscribe(mySubscriber);

1.Observable和Subscriber可以做任何事情

Observable可以是一个数据库查询,Subscriber用来显示查询结果;Observable可以是屏幕上的点击事件,Subscriber用来响应点击事件;Observable可以是一个网络请求,Subscriber用来显示请求结果。

2.Observable和Subscriber是独立于中间的变换过程的。

在Observable和Subscriber中间可以增减任何数量的map。整个系统是高度可组合的,操作数据是一个很简单的过程。


我们可以将任意多个API调用链接起来。大家应该都应该知道同步所有的API调用,然后将所有API调用的回调结果组合成需要展示的数据是一件多么蛋疼的事情。这里我们成功的避免了callback hell(多层嵌套的回调,导致代码难以阅读维护)。现在所有的逻辑都包装成了这种简单的响应式调用。

操作符功能强大,操作符可以让你对数据流做任何操作。将一系列的操作符链接起来就可以完成复杂的逻辑。代码被分解成一系列可以组合的片段。这就是响应式函数编程的魅力。用的越多,就会越多的改变你的编程思维。

In RxJava, you can tell yourObservercode which thread to run on usingsubscribeOn(), and which thread yourSubscribershould run on usingobserveOn()

subscribeOn(): 指定subscribe()所发生的线程,即Observable.OnSubscribe被激活时所处的线程。或者叫做事件产生的线程。 *observeOn(): 指定Subscriber所运行在的线程。或者叫做事件消费的线程。

只要有异常发生onError()一定会被调用

使用RxJava,Observable对象根本不需要知道如何处理错误!操作符也不需要处理错误状态-一旦发生错误,就会跳过当前和后续的操作符。所有的错误处理都交给订阅者来做。

常见使用场景:

                  检查缓存再网络;

                  多个接口并发结束后更新数据;

                  一个接口的请求依赖另一个API请求返回的数据;

                  响应式的界面;

                  RxJava 提供了对事件序列进行变换的支持,这是它的核心功能之一,也是大多数人说『RxJava 真是太好用了』的最大原因。所谓变换,就是将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列

使用响应式编程可以更好的处理内存泄露问题, 代码也更加优雅和可读, 选择执行线程和监听线程也更加方便



RxAndroid

https://github.com/lzyzsd/Awesome-RxJava

随着程序逻辑变得越来越复杂,它依然能够保持简洁(luojijianjie

RxAndroid是RxJava的一个针对Android平台的扩展。它包含了一些能够简化Android开发的工具

AndroidSchedulers提供了针对Android的线程系统的调度器;AndroidObservable,它提供了跟多的功能来配合Android的生命周期。bindActivity()和 bindFragment()方法默认使用AndroidSchedulers.mainThread()来执行观察者代码,这两个方法会在 Activity或者Fragment结束的时候通知被观察者停止发出新的消息;

最后要介绍的是ViewObservable,使用它可以给View添加了一些绑定。如果你想在每次点击view的时候都收到一个事件,可以使用 ViewObservable.clicks(),或者你想监听TextView的内容变化,可以使用ViewObservable.text()。

ViewObservable.clicks(mCardNameEditText,false)

.subscribe(view -> handleClick(view));

Retrofit(解耦)

http://www.tuicool.com/articles/26jUZjv

http://www.jianshu.com/p/fb8d21978e38

Retrofit是一套RESTful架构的Android(Java)客户端实现,基于注解,提供JSON to POJO(Plain Ordinary Java Object,简单Java对象),POJO to JSON,网络请求(POST,GET,PUT,DELETE等)封装

Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的.REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。

另一个重要的 REST 原则是分层系统,这表示组件无法了解它与之交互的中间层以外的组件。通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。

当 REST 架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。REST 简化了客户端和服务器的实现。

Retrofit的使用就是以下几步:

           1.定义接口,参数声明,Url都通过Annotation指定

           2.通过RestAdapter生成一个接口的实现类(动态代理)

           3.调用接口请求数据

1 通过门面Retrofit来build一个Service Interface的proxy 通过create方法拿到接口的实现类,这里利用Java的Proxy类完成动态代理的相关代理

RxJava RxAndroid Retrofit_第1张图片

retrofit03.png

当你调用这个Service Interface中的某个请求方法,会被proxy拦截。

RxJava RxAndroid Retrofit_第2张图片

retrofit02.png

通过ServiceMethod来解析invoke的那个方法    ,通过解析注解,传参,将它们封装成我们所熟悉的request。然后通过具体的返回值类型,让之前配置的工厂生成具体的CallAdapterResponseConverter,这俩我们稍后再解释。

new一个OkHttpCall,这个OkHttpCall算是OkHttp的包装类,用它跟OkHttp对接,所有OkHttp需要的参数都可以看这个类。当然也还是可以扩展一个新的Call的,比如HttpUrlConnectionCall。但是有点耦合。看下图标注:

RxJava RxAndroid Retrofit_第3张图片

retrofit031.png

红框中显式的指明了OkHttpCall,而不是通过工厂来生成Call。所以如果你不想改源码,重新编译,那你就只能使用OkHttp了。不过这不碍事。(可能也是因为还在持续更新中,所以这块可能后面会改进的)

生成的CallAdapter有四个工厂,分别对应不同的平台,RxJava, Java8, Guava还有一个Retrofit默认的。这个CallAdapter不太好用中文解释。简单来说就是用来将Call转成T的一个策略。因为这里具体请求是耗时操作,所以你需要CallAdapter去管理线程。怎么管理,继续往下看。

比如RxJava会根据调用方法的返回值,如Response<'T> |Result<'T>|Observable<'T> ,生成不同的CallAdapter。实际上就是对RxJava的回调方式做封装。比如将response再拆解为success和error等。(这块还是需要在了解RxJava的基础上去理解,以后有时间可以再详细做分析)

在步骤5中,我们说CallAdapter还管理线程。比方说RxJava,我们知道,它最大的优点可以指定方法在什么线程下执行。如图

retrofit04.png

我们在子线程订阅(subscribeOn),在主线程观察(observeOn)。具体它是如何做的呢。我们看下源码。

RxJava RxAndroid Retrofit_第4张图片

retrofit05.png

在adapt Call时,subscribeOn了,所以就切换到子线程中了。

在adapt Call中,具体的调用了Call execute(),execute()是同步的,enqueue()是异步的。因为RxJava已经切换了线程,所以这里用同步方法execute()。

RxJava RxAndroid Retrofit_第5张图片

retrofit06.png

接下来的具体请求,就是OkHttp的事情了,retrofit要做成的就是等待返回值。在步骤4中,我们说OkHttpCall是OkHttp的包装类,所以将OkHttp的response转换成我们要的T,也是在OkHttpCall中执行的。

当然具体的解析转换操作也不是OkHttpCall来做的,因为它也不知道数据格式是什么样的。所以它只是将response包装成retrofit标准下的response。

Converter->ResponseConverter,很明显,它是数据转换器。它将response转换成我们具体想要的T。Retrofit提供了很多converter factory。比如Gson,Jackson,xml,protobuff等等。你需要什么,就配置什么工厂。在Service方法上声明泛型具体类型就可以了。

最后,通过声明的observeOn线程回调给上层。这样上层就拿到了最终结果。至于结果再如何处理,那就是上层的事了。

Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp

RxJava RxAndroid Retrofit_第6张图片


通过一系列的设计模式,封装思想来解耦,看到现在,其实retrofit就是一个负责调度的controller。先给retrofit配置好,让它能够正常工作。你给它一个方法调用,它就在内部开始运转。这个方法以前我消化过吗,没消化那就用一个ServiceMethod来解析它。解析后要用来配置一个request请求。但它自己搞不定这事啊,所以需要给它一个转接头,通过转接头来使用okhttpcall。请求是做好了,但是response它又不认识,

所以又请来convertor来帮忙,转换完毕之后才吐出一个我们最终要的那个对象。

你可能感兴趣的:(RxJava RxAndroid Retrofit)