RxJava:RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,归纳得很是精准。总之就是让异步操做变得很是简单。数据库
各自的职责:Retrofit 负责请求的数据和请求的结果,使用接口的方式呈现,OkHttp 负责请求的过程,RxJava 负责异步,各类线程之间的切换。网络
说明:使用POST 请求方式时,只须要更改方法定义的标签,用@POST 标签,参数标签用 @Field 或者@Body或者FieldMap,注意:使用POST 方式时注意2点,1,必须加上 @FormUrlEncoded标签,不然会抛异常。2,使用POST方式时,必需要有参数,不然会抛异常,异步
添加自定义的header(token)async
Retrofit提供了两个方式定义Http请求头参数:静态方法和动态方法,静态方法不能随不一样的请求进行变化,头部信息在初始化(retrofit)的时候就固定了。而动态方法则必须为每一个请求都要单独设置。ide
配合RxJava 使,更改定义的接口,返回值再也不是一个Call ,而是返回的一个Observble.post
RxJava 的这个实现,代码变多了,可是是一条从上到下的链式调用,没有任何嵌套,这在逻辑的简洁性上是具备优点的。当需求变得复杂时,这种优点将更加明显性能
RxJava 的观察者模式线程
https://link.jianshu.com/?t=http://gank.io/post/560e15be2dca930e00da1083code
RxJava 有四个基本概念:Observable
(可观察者,即被观察者)、 Observer
(观察者)、 subscribe
(订阅)、事件。Observable
和 Observer
经过 subscribe()
方法实现订阅关系,从而 Observable
能够在须要的时候发出事件来通知 Observer
。orm
与传统观察者模式不一样, RxJava 的事件回调方法除了普通事件 onNext()
(至关于 onClick()
/ onEvent()
)以外,还定义了两个特殊的事件:onCompleted()
和 onError()
。
onCompleted()
: 事件队列完结。RxJava 不只把每一个事件单独处理,还会把它们看作一个队列。RxJava 规定,当不会再有新的 onNext()
发出时,须要触发 onCompleted()
方法做为标志。onError()
: 事件队列异常。在事件处理过程当中出异常时,onError()
会被触发,同时队列自动终止,不容许再有事件发出。onCompleted()
和 onError()
有且只有一个,而且是事件序列中的最后一个。须要注意的是,onCompleted()
和 onError()
两者也是互斥的,即在队列中调用了其中一个,就不该该再调用另外一个。1) Scheduler 的 API (一)
在RxJava 中,Scheduler
——调度器,至关于线程控制器,RxJava 经过它来指定每一段代码应该运行在什么样的线程。RxJava 已经内置了几个 Scheduler
,它们已经适合大多数的使用场景:
Schedulers.immediate()
: 直接在当前线程运行,至关于不指定线程。这是默认的 Scheduler
。Schedulers.newThread()
: 老是启用新线程,并在新线程执行操做。Schedulers.io()
: I/O 操做(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler
。行为模式和 newThread()
差很少,区别在于 io()
的内部实现是是用一个无数量上限的线程池,能够重用空闲的线程,所以多数状况下 io()
比 newThread()
更有效率。不要把计算工做放在 io()
中,能够避免建立没必要要的线程。Schedulers.computation()
: 计算所使用的 Scheduler
。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操做限制性能的操做,例如图形的计算。这个 Scheduler
使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操做放在 computation()
中,不然 I/O 操做的等待时间会浪费 CPU。AndroidSchedulers.mainThread()
,它指定的操做将在 Android 主线程运行这里出现了一个叫作 Func1
的类。它和 Action1
很是类似,也是 RxJava 的一个接口,用于包装含有一个参数的方法。 Func1
和 Action
的区别在于, Func1
包装的是有返回值的方法。另外,和 ActionX
同样, FuncX
也有多个,用于不一样参数个数的方法。FuncX
和 ActionX
的区别在 FuncX
包装的是有返回值的方法。
image.png
性能问题解决,但……这代码实在是太乱了,迷之缩进啊!杂乱的代码每每不只仅是美观问题,由于代码越乱每每就越难读懂,而若是项目中充斥着杂乱的代码,无疑会下降代码的可读性,形成团队开发效率的下降和出错率的升高。
这时候,若是用 RxJava 的形式,就好办多了。 RxJava 形式的代码是这样的:
getUser(userId) .doOnNext(new Action1<User>() { @Override public void call(User user) { processUser(user); }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<User>() { @Override public void onNext(User user) { userView.setUser(user); } @Override public void onCompleted() { } @Override public void onError(Throwable error) { // Error handling ... } });
后台代码和前台代码全都写在一条链中,明显清晰了不少。
先请求token,再根据获取的token请求数据
而使用 RxJava 的话,代码是这样的:
@GET("/token") public Observable<String> getToken(); @GET("/user") public Observable<User> getUser(@Query("token") String token, @Query("userId") String userId); getToken() .flatMap(new Func1<String, Observable<User>>() { @Override public Observable<User> onNext(String token) { return getUser(token, userId); }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<User>() { @Override public void onNext(User user) { userView.setUser(user); } @Override public void onCompleted() { } @Override public void onError(Throwable error) { // Error handling ... } });