Rxjava简单使用

1,389 阅读1分钟

一、简介

Rxjava:Reactive Extensions for the JVM,基于JVM的Rx。

Reactive Extensions(Rx)原来是由微软提出的一个综合了异步和基于事件驱动编程的库。

优势:

  • 具有响应式编程该有的特性。
  • 为异步而生,无需手动创建线程,并具备线程切换能力。
  • 支持链式调用,保证代码的简洁性。
  • 各种操作符,功能非常强大。满足各种业务需求。
  • 简化了异常的处理。 Rxjava适用场景: 网络请求、数据库读写、文件读写、定时任务等各种耗时操作需要通过异步来完成的操作都可以使用Rxjava。

观察者:Observer,观察事件变化并处理的主要角色。消费者(Consumer)也可以理解成一种特殊的观察者。

被观察者

  • 触发事件并决定什么时候发送事件的主要角色。(异步和完成也是一种事件)
  • Observable、Flowable、Single、Completable、Maybe都是被观察者。
  • Flowable是支持背压的一种被观察者。
  • Single、Completable、Maybe是简化版的Obsercable。
  • 几种被观察者通过toObservable/toFlowable/toSingle/toCompletable/toMaybe相互转换。

订阅(subscribe):观察者和被观察者建立关联的操作。

1、添加依赖。

  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 RxService {
    @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();
        RxService service = retrofit.create(RxService.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) {

                    }
                });