如何用RxJava + Retrofit完成网络请求

3,758 阅读2分钟

RxJava定义:

RxJava 是一个用于实现异步操作的库。

RxJava可以视为异步,其核心为 Observables(被观察者) 和 Observable(观察者)。Observables可以发出一系列的事件,事件执行结束后交给Observable 的回调处理。

RxJava2 的观察者模式

观察者模式是对象的行为模式,也叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

采用观察者模式可以避免去轮询检查,节约有限的cpu资源。

RxJava 作为一个工具库,使用的便是通用形式的观察者模式:

image

普通事件:onNext(),相当于 onClick()、onEvent();特殊事件:onCompleted() 和 onError()

如图所示,RxJava 的基本概念分别为:

1.Observable(被观察者,事件源)

2.Observer(观察者,订阅者)

3.subscribe (订阅)

4.事件

RxJava 把多个事件看做一个队列,并对每个事件单独处理。 onCompleted() 表示请求成功完成任务没有出现错误 onError() 表示请求失败终止请求

2.RxJava2 响应式编程结构

响应式编程的组成为Observable/Operator/Subscriber,RxJava在响应式编程中的基本流程如下:

这个流程,可以简单的理解为:Observable -> Operator1 -> Operator2 -> Operator3 -> Subscriber

  1. Observable发出一系列事件,他是事件的产生者;

  2. Subscriber负责处理事件,他是事件的消费者;

  3. Operator是对Observable发出的事件进行修改和变换; 若事件从产生到消费不需要其他处理,则可以省略掉中间的Operator,从而流程变为Obsevable -> Subscriber;

  4. Subscriber通常在主线程执行,所以原则上不要去处理太多的事务,而这些复杂的处理则交给Operator;

RxJava + Retrofit完成网络请求

1、添加依赖。前四个分别是RxJava、RxAndroid、Retrofit以及Gson的库,最后那个才是新加入的,RxJava + Retrofit的使用需要用到最后那个包。

  compile 'io.reactivex:rxjava:2.0.4'
  compile 'io.reactivex:rxandroid:2.0.1'
  compile 'com.squareup.retrofit2:retrofit:2.0.2'
  compile 'com.squareup.retrofit2:converter-gson:2.0.2'
  compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'

2、写一个登录的service

public interface Service {
    @GET("user/login" )
    Observable<UserInfo> login(
            @Query("username") String username,
            @Query("password") String password
    );
}

3、使用Observable完成一个网络请求,登录成功后保存数据到本地。

        Retrofit retrofit = new Retrofit.Builder()
              .addConverterFactory(GsonConverterFactory.create())
              .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
              .baseUrl(BASE_URL)
              .build();
        MyService service = retrofit.create(MyService.class);

        service.login(phone, password)             
                .subscribeOn(Schedulers.newThread())
                .observeOn(Schedulers.io())        
                .doOnNext(new Action1<UserInfo>() {
                    @Override
                    public void call(UserInfo userInfo) {
                        saveUserInfo(userInfo);
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<UserInfo>() {
                    @Override
                    public void onCompleted() {
                        
                    }

                    @Override
                    public void onError(Throwable e) {
                       
                    }

                    @Override
                    public void onNext(UserInfo userInfo) {

                    }
                });