Today,学习RxJava 的操作符,首先献出官方文档 0 。操作符比较多,我们学习重要的常用的就好啦,就按照官方文档中操作符的分类来学习,今天学习的是 ** Creating Observables ** —— 创建被观察者的操作符。
文中的图 或 测试代码 部分来官方文档
Create
-
1.作用分析
create 是最简单的操作符,就是创建一个Observable (被观察者),然后适当的调用执行 Observer(观察者)的 onNext ,onCompleted 或 onError 方法。
-
2.代码示例
// 测试代码
Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super Integer> observer) {
try {
if (!observer.isUnsubscribed()) {
for (int i = 1; i < 5; i++) {
observer.onNext(i);
}
observer.onCompleted();
}
} catch (Exception e) {
observer.onError(e);
}
}
} ).subscribe(new Subscriber() {
@Override
public void onNext(Integer item) {
System.out.println("Next: " + item);
}
@Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}
@Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
});
输出结果:
Next: 1
Next: 2
Next: 3
Next: 4
Sequence complete.
-
3.源码分析
源码分析可以查看上一篇文章 RxJava 源码学习之最简单的Demo
Just
-
1.作用分析
Just操作符可以接收1~9个参数,将参数转为Observable对象,并按原来的顺序将参数逐个发送出来。其订阅过程与create一样,均是在执行subscribe(observer)时产生事件。
-
2.代码示例
//测试代码
Observable.just(1, 2, 3)
.subscribe(new Subscriber() {
@Override
public void onNext(Integer item) {
System.out.println("Next: " + item);
}
@Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}
@Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
});
输出结果:
Next: 1
Next: 2
Next: 3
Sequence complete.
-
3.源码分析
- part 1
//找到查看 Just 方法
public static Observable just(final T value) {
return ScalarSynchronousObservable.create(value);
}
......
public static Observable just(T t1, T t2, T t3, T t4, T t5, T t6, T t7, T t8, T t9) {
return from((T[])new Object[] { t1, t2, t3, t4, t5, t6, t7, t8, t9 });
}
我们可以找到9个just
对应的方法,除当只有一个参数时,进入ScalarSynchronousObservable.create
,其他的都转换成了 from操作符(后面会分析)。所以,我们这里分析一下当只有一个参数的情况。
- part 2
public final class ScalarSynchronousObservable extends Observable {
public static ScalarSynchronousObservable create(T t) {
return new ScalarSynchronousObservable(t);
}
protected ScalarSynchronousObservable(final T t) {
super(hook.onCreate(new JustOnSubscribe(t)));
this.t = t;
}
.......省略其他代码......
}
ScalarSynchronousObservable 是 Observable 的继承类,t 就是我们传入的参数,hook(RxJavaObservableExecutionHook)就是一个代理类(RxJava 源码学习之最简单的Demo中有分析过),hook.onCreate 返回的就是这个JustOnSubscribe类型的对象。从上面可以看出来,是将一个JustOnSubscribe类型的对象赋值给了 Observable.onSubscribe(RxJava 源码学习之最简单的Demo中分析过,subscribe()其实就是调用的 Observable.onSubscribe.call())。所以,看一下JustOnSubscribe这个类。
- part 3
static final class JustOnSubscribe implements OnSubscribe {
final T value;//传递的参数
JustOnSubscribe(T value) {
this.value = value;
}
@Override
public void call(Subscriber super T> s) {
// s 就是 Observable.subsrcibe()传递的 观察者对象
s.setProducer(createProducer(s, value));
}
}
//将 观察者s 和 参数v 进行处理
static Producer createProducer(Subscriber super T> s, T v) {
if (STRONG_MODE) {
return new SingleProducer(s, v);
}
return new WeakSingleProducer(s, v);
}
.......
//Subscriber 观察者的方法
public void setProducer(Producer p) {
long toRequest;
boolean passToSubscriber = false;
//同步锁
synchronized (this) {
toRequest = requested;
producer = p;
if (subscriber != null) {
//是否需要排队
if (toRequest == NOT_SET) {
//不需要排队
passToSubscriber = true;
}
}
}
// 排队
if (passToSubscriber) {
subscriber.setProducer(producer);
} else {
//不排队
if (toRequest == NOT_SET) {
producer.request(Long.MAX_VALUE);
} else {
producer.request(toRequest);
}
}
}
从上面代码中,我们明白 JustOnSubscribe 实现了 OnSubscribe接口,在 call() 方法中对观察者s 和 参数v 进行了处理,合成了一个 Producer 对象。且,Subscriber 是同步调用了 Producer.request()。所以,我们再看下 Producer类。
- part 4
public final class SingleProducer extends AtomicBoolean implements Producer {
...省略其他代码...
public SingleProducer(Subscriber super T> child, T value) {
this.child = child; //传递的 观察者参数
this.value = value; //传递的 数据参数
}
@Override
public void request(long n) {
...省略其他代码...
c.onNext(v);
c.onCompleted();
}
}
我们可以看到在 Producer 中调用了 Subscriber(观察者)的 onNext,onComplement,并在onNext 中传递了 数据参数 v。
- part 5
好的,我们明白了,Just 操作符其实就是将参数们创建成一个个Observable对象,然后按原本顺序逐个的发送出来给 Observer处理。(当然这个顺序情况,因为没分析多个参数的情况,这里还不是很清楚;多个参数情况,在 From 操作符中分析)
From
-
1.作用分析
如果你想使用的所有数据都可以表示为Observables,而不是Observables和其他类型的混合,你就可以很方便地通过使用 From(单组运算符)来管理数据流的整个生命周期。
多种参数传递方式:
Javadoc: from(array)
Javadoc: from(Iterable)
Javadoc: from(Future)
Javadoc: from(Future,Scheduler)
Javadoc: from(Future,timout,timeUnit)
-
2.1代码示例
//测是代码
Integer[] nums = {1,3,7,2,5};
Observable.from(nums)
.subscribe(new Subscriber() {
@Override
public void onNext(Integer item) {
System.out.println("Next: " + item);
}
@Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}
@Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
});
输出结果:
Next: 1
Next: 3
Next: 7
Next: 2
Next: 5
Sequence complete.
-
2.2示例代码
/**
{@code Future}表示异步计算的结果。 提供了检查计算是否完成,等待其完成以及检索计算结果的方法。
只有当计算完成时,才能使用方法{@code get}检索结果,必要时阻止,直到准备好为止。
取消由{@code cancel}方法执行。 提供了附加的方法来确定任务是否正常完成或被取消。
一旦计算完成,计算就不能取消。 如果您希望使用{@code Future}以取消可用性,但不提供可用的结果,
则可以声明{@code Future <?>}格式的类型,并返回{@code null} 基础任务。
**/
Observable.from(new Future() {
@Override
public boolean cancel(boolean mayInterruptIfRunning) { return false; }
@Override
public boolean isCancelled() { return false; }
@Override
public boolean isDone() { return false; }
@Override
public String get() throws InterruptedException, ExecutionException { return "Hello world !"; }
@Override
public String get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
System.out.println("timeout-"+timeout+"--unit-"+unit);
return "Hello world!";
}})
.subscribe(new Subscriber() {
@Override
public void onNext(String item) { System.out.println("Next: " + item); }
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); }});
输出结果:
Next: Hello world !
Sequence complete.
Defer
-
1.作用分析
直到 Observer(观察者)订阅时,才去创建Observable(被观察者),并且是给每一个 Observer(观察者) 创建一个新的 Observable(被观察者)。虽然,每个Observer 认为他们正在订阅同一个 Observable,但事实上每个Observer 都是拥有自己独立的序列的,独立的Observable。
-
2.代码示例
private Integer[] nums = {1,2,3,4};
private Integer[] yy = {7,8,9,0};
public void operatorDefer(){
Observable mObservable = Observable.defer(new Func0>() {
@Override
public Observable call() {
return Observable.from(nums);
}
});
//改变数组值
nums = yy;
mObservable.subscribe(new Subscriber() {
@Override
public void onNext(Integer item) { System.out.println("Next: " + item); }
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); } });}
输出结果:
Next: 7
Next: 8
Next: 9
Next: 0
Sequence complete.
defer 操作符输出的结果是 7,8,9,0
,说明直到 观察者订阅时,才去创建Observable(被观察者)
Start
-
1.作用分析
返回一个Observable,它发射一个类似于函数声明的值。可以在Observables调用链中与其它Observable搭配使用。
注意:这个函数只会被执行一次,即使多个观察者订阅这个返回的Observable。
-
2.示例代码
Timer
-
1.作用分析
创建一个Observable,它在一个给定的延迟后发射一个特殊的值。
-
2.示例代码
System.out.println("开始:"+System.currentTimeMillis()/1000);
Observable.timer(3,TimeUnit.SECONDS)
.subscribe(new Action1() {
@Override
public void call(Long aLong) {
System.out.println("执行:"+System.currentTimeMillis()/1000);
System.out.println("hello world");
}
});
输出结果:
开始:1478419551
执行:1478419554
hello world
参考文档:
RxJava官方文档
结束语
Perfect!!! 我们分析完RxJava的创建类操作符了,当然还深入的不够,但是我们一步一个脚印,慢慢来。下一篇,我们就来源码分析 RxJava 的变换操作符。
欢迎大家一起讨论学习!