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 的操作符 说明 例如
其中有一些高频使用的操作符如下:
总结:
那这篇文章主要介绍了 rxjava 的基本使用,下篇文章主要会介绍 rxjava 的另一个强大的功能,线程切换,敬请期待!
本文如有什么错误欢迎指出
- Rxjava2从入门到源码(一)
- Rxjava2从入门到源码(二)
- RxJava2.0 从入门到放弃?
- android 从Rxjava2.0到Retrofit (一)
- RxJava2 源码解析(一)
- Rxjava2源码浅析(一)
- Rxjava2 源码解析(一)
- RxJava2 源码分析(一)
- Magento从入门到精通(一)
- GUI从入门到精通(一)
- Docker 从入门到放弃(一)
- 从入门到深入Fiddler (一)
- glide从入门到精通(一)
- ActiveMQ从入门到精通(一)
- Kotlin从入门到“放弃”(一)
- Kotlin 从入门到实战(一)
- postgresql从入门到菜鸟(一)
- ActiveMQ从入门到精通(一)
- Linux Makefile文件编写与使用学习
- 定时器
- 使用反射技术封装JDBC
- mysql中JDBC相关知识
- Java 的引用传递与值传递
- Rxjava2从入门到源码(一)
- 关系映射,多对多的帮助理解
- 【线段树,Treap】CodeChef COT5 Count on a Treap
- git整理
- UVa 455 Periodic Strings
- 使用Fork/Join框架计算斐波那契
- HTML菜鸟入门6
- LintCode:M-硬币排成线 II
- 将maven项目导入到myeclipse遇到的几个问题