Rxjava2从入门到源码(一)

来源:互联网 发布:java开发文档怎么写 编辑:程序博客网 时间:2024/05/22 16:52


一、概述


  

最近工作不是特别紧,前段时间 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组合成一个单一的Observableand、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 的另一个强大的功能,线程切换,敬请期待!



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

原创粉丝点击