美文网首页
RxJava RxAndroid Retrofit

RxJava RxAndroid Retrofit

作者: chelFang | 来源:发表于2016-07-18 16:11 被阅读0次

    参考:

    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类完成动态代理的相关代理

    retrofit03.png

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

    retrofit02.png

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

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

    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)。具体它是如何做的呢。我们看下源码。

    retrofit05.png

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

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

    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


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

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

    相关文章

      网友评论

          本文标题:RxJava RxAndroid Retrofit

          本文链接:https://www.haomeiwen.com/subject/gempjttx.html