当前Android 网络请求最流行的方式,RxJava + Retrofit + okHttp !

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 (订阅)、事件。ObservableObserver 经过 subscribe() 方法实现订阅关系,从而 Observable 能够在须要的时候发出事件来通知 Observerorm

与传统观察者模式不一样, 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。
  • 另外, Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操做将在 Android 主线程运行

这里出现了一个叫作 Func1 的类。它和 Action1 很是类似,也是 RxJava 的一个接口,用于包装含有一个参数的方法。 Func1Action 的区别在于, Func1 包装的是有返回值的方法。另外,和 ActionX 同样, FuncX 也有多个,用于不一样参数个数的方法。FuncXActionX 的区别在 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
            ...
        }
    });
相关文章
相关标签/搜索