RxJava使用

130 阅读2分钟

RxJava是什么

RxJava是由ReactiveX开发并维护的一个开源项目。一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库。有点抽象,这句话说白了就是观察者模式、异步、事件流。RxJava是一种响应式编程。

RxJava怎么用

Retrofit 2.0中加入了CallAdapter机制,官方已经准备好了几个CallAdapter module,其中最著名的module可能是为RxJava准备的CallAdapter,它能将请求结果作为Observable返回,而不是默认的Call对象。

  • 添加依赖:
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'
compile 'io.reactivex:rxjava:1.1.3'
compile 'io.reactivex:rxandroid:1.1.0'
  • Retrofit Builder链表中加入RxJavaCallAdapterFactory
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
    .build();
  • 定义HTTP的API对应的接口,将返回Call改为返回Observable:

public interface MyService {
   @FormUrlEncoded  //表单方式传递键值对
   @POST("user/login")  
   Observable<UserInfo> login(
           @Field("username") String username,
           @Field("password") String password
   );
}

相比之前的接口文件,这里login()方法的返回值是不在是Call类型而是Observable类型。

  • 使用Observable完成一个网络请求,登录成功后保存数据到本地
        MyService service = retrofit.create(MyService.class);
        service.login(phone, password)               //获取Observable对象
                .subscribeOn(Schedulers.newThread())//请求在新的线程中执行
                .observeOn(Schedulers.io())         //请求完成后在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) {
                        //请求成功
                    }
                });
}

RxJava + Retrofit 形式的时候,Retrofit 把请求封装进 Observable ,在请求结束后调用 onNext() 或在请求失败后调用 onError()。相比之前,我们需要提供一个 Adapter,将 OkHttpCall 转换为 Observable ——RxJavaCallAdapterFactory。

可以看到,调用了service的login方法后得到Observable对象,在新的线程中执行网络请求,请求成功后切换到io线程执行保存用户信息的动作,最后再切换到主线程执行请求失败onError()、请求成功onNext()。整体的逻辑十分清晰都在一条链中,就算还有别的要求还可以往里面添加,丝毫不影响代码的简洁。