Rxjava2从入门到源码(一)


一、概述


  

最近工作不是特别紧,前段时间 rxjava 盛行,作为一个求知欲这么强的我怎么能不了解 rxjava,于是在闲暇时间学习了一下 rxjava ,刚开始学习的时候很难理解 rxjava 作者的思想,但是到后来慢慢的明白了作者的用意,其核心思想就是响应式编程。


二、响应式编程

   

我们先来说一下响应式编程的概念:

基于异步数据流的编程方式,它希望有某种方式能够构建关系,而不是执行某种赋值命令。

数据流:

说到概念我们就不得不说一下数据流了,我们把数据流比作一条河,这条河可以被观测,被过滤,甚至可以和另外一条数据流合并成一条,任何事物都能成为数据流,例如用户输入,变量等等,你可以检测数据流,并作出反应。

事件:

我们知道了数据流,那数据流是如何产生的呢,是通过事件产生的,事件可以触发过程,可以被等待,事件是唯一的以合适的方式将我们的现实世界映射带我们的软件中,我们好多的操作都是一个事件,例如我们触摸屏幕,我们摇晃手机,我们来电时候的手机震动,都可以称之为事件。

那我们的响应式编程就是通过数据流和异步把事件联系起来的编程


我们只能异步的监测发出的数据流,当我们定义函数监听数据流的时候这样就产生了订阅关系,那我们定义的函数就称之为下游观察者,发出数据流的我们称之为上游被观察者,那这就让我们想到了观察者模式。下一节我们就说一下如何定义,观察者和被观察者,再说一下如何使两者建立关系。



三、最常用的 API:Observable 和 Observer


   

我们首先说一下 Observer(观察者)常用的创建 Observer 的方法:


  


Observer observer = new Observer() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull Object o) {

            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        };


这四个方法中我一一去解释下:


onSubscribe 方法,这个方法是在我们订阅之前调用的,里面有一个 Disposable 的参数,这个参数的作用是判断观察者和别观察者的链接是否还在,可以通过 isDisposed 方法判断是否连接还在,也可以通过 dispose 方法断开链接,如果断开链接了只是观察者收不到事件,但是被观察者还是在执行发送事件。

 

onNext 方法:这个方法事我们处理事件的方法。

 

onError 方法:此方法是当我们在事件的监测过程中发生错误了的回掉方法。

 

onComplete方法:此方法是当事件发送完成调用的方法。


注意:虽然 onSubscribe 方法是在观察者中,但是它执行是在订阅前面的。

            onError 方法和 onComplete 方法只能执行一个,两个方法是互斥的。


 

Observable (被观察者) 先来看一下被观察者的创建方法:

Observable observable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
                e.onNext("http://fj.ikafan.com/attachment/forum/201510/16/150108pf2fgjw7i33bq22w.jpg");
            }
        })

  


  

这是一种最常见的创建方法,创建的时候需要传递一个 ObservableOnSubscribe 对象,在这个对象中,有一个 subscribe 方法,这个方法正是我们发送事件的方法,我们可以通过这个方法中的 ObservableEmitter 调用观察者的方法,那么为什么这个 ObservableEmitter 为什么可以调用观察者中的方法呢,我们后续文章会讲解。下面在看几个另外的创建方法:


Observable observable = Observable.just("staing","111","1111");
        String[] a = {"1","2","3"};
        Observable.fromArray(a);


这些方法其实和第一种创建的方式差不多,只不过帮我们去发送了事件,其实创建的方法还有很多,我就不一一举例了。

那我们的观察者和被观察者都创建好了,那它们怎么去相互联系呢,其实联系是比较简单的,只需要一句话:


observable.subscribe(observer);

那合并到一起就是这个样子的:


Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Object> e) throws Exception {
                
            }
        }).subscribe(new Observer<Object>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                
            }

            @Override
            public void onNext(@NonNull Object o) {

            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });

那 rxjava 的基本用法就已经讲完了,那我们如何对我们发送的事件进行处理呢,下节我们去揭晓。




四、数据流的控制


要说 rxjava 中的操作符,真的丰富的不能再丰富了,我们主要说两个比较重要的,首先是 map ,那 map 是做什么的呢,map 的主要功能就是转化数据类型,例如我们上游被观察者发送了一个 String 类型的事件,通过 map 的转化,在下游观察者收到的就可以是 Bitmap类型的数据,下面看代码:


Observable observable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
                e.onNext("http://fj.ikafan.com/attachment/forum/201510/16/150108pf2fgjw7i33bq22w.jpg");
            }
        }).map(new Function<String, Bitmap>() {
            @Override
            public Bitmap apply(@NonNull String s) throws Exception {
               // 进行接口请求
                return 接口返回的图片;
            }
        }).subscribe(new Observer<Bitmap>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull Bitmap bitmap) {
                //setBitmap
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });

从上面的代码中我们可以看出 map 的功能,那这个功能在我们的开发中有着很重要的作用,在后面的文章中我将会讲到 map 的原理,那下一个要说的就是 flatmap 这个操作符,flatmap 这个操作符与 map 很相似,只不过 flatmap 是将基本类型转换成 Observable,然后发送的是集合,那他的功能就是把一个事件变成多个事件并发送,下面看代码:



Observable<Object> observable = Observable.just(list).flatMap(new Function<List<String>, ObservableSource<?>>() {
            @Override
            public ObservableSource<?> apply(List<String> strings) throws Exception {
                return Observable.fromIterable(strings);
            }
        });



RxJava 的操作符 说明 例如
创建操作 用于创建Observable的操作符 create、defer、from、just、start、repeat、range
变换操作 用于对Observable发射的数据进行变换 buffer、window、map、flatMap、groupBy、scan
过滤操作 用于从Observable发射的数据中进行选择 debounce、distinct、filter、sample、skip、take
组合操作 用于将多个Observable组合成一个单一的Observable and、startwith、join、merge、switch、zip
异常处理 用于从错误通知中恢复 catch、retry
辅助操作 用于处理Observable的操作符 delay、do、observeOn、subscribeOn、subscribe
条件和布尔操作   all、amb、contains、skipUntil、takeUntil
算法和聚合操作   average、concat、count、max、min、sum、reduce
异步操作   start、toAsync、startFuture、FromAction、FromCallable、runAsync
连接操作   connect、publish、refcount、replay
转换操作   toFuture、toList、toIterable、toMap、toMultiMap
阻塞操作   forEach、first、last、mostRecent、next、single
字符串操作   byLine、decode、encode、from、join、split、stringConcat

其中有一些高频使用的操作符如下:

常用操作符 说明
interval 延时几秒,每隔几秒开始执行
take 超过多少秒停止执行
map 类型转换
observeOn 在主线程运行
doOnSubscribe 在执行的过程中
subscribe 订阅

总结:

那这篇文章主要介绍了 rxjava 的基本使用,下篇文章主要会介绍 rxjava 的另一个强大的功能,线程切换,敬请期待!



本文如有什么错误欢迎指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值