简单回顾
如果抛开Rxjava的操作符以及其线程控制的话,Rxjava的最基本使用是比较简单的
第一步,创建被观察者Observable;
第二步,创建观察者Observer/Subscriber;
第三步,subscribe;
三个关键对象和一个核心方法
- 三个关键对象
Observable(被观察者)
OnSubscribe
此对象是Observable
内部的对象,
可以对等地理解成是观察者模式
中,
被观察者
用来通知观察者
的notifyObservers()方法
;Subscriber(观察者)
- 一个核心方法
- subscribe()
订阅方法,
完成观察者和被观察者之间的订阅;
- subscribe()
Rxjava源码相关分析
Observable
类中的create()源码
:
public class Observable {
final OnSubscribe onSubscribe;
protected Observable(OnSubscribe f) {
this.onSubscribe = f;
}
static final RxJavaObservableExecutionHook hook = RxJavaPlugins.getInstance().getObservableExecutionHook();
public static Observable create(OnSubscribe f) {
return new Observable(hook.onCreate(f));
}
@Beta
public static Observable create(SyncOnSubscribe syncOnSubscribe) {
return new Observable(hook.onCreate(syncOnSubscribe));
}
@Experimental
public static Observable create(AsyncOnSubscribe asyncOnSubscribe) {
return new Observable(hook.onCreate(asyncOnSubscribe));
}
...
}
- 第一步,调用
Observable.create()
方法完成Observable
的创建;
下面跟进create()源码
,我们发现
create方法内部
,
会传入一个OnSubscribe
的参数
,
其实这个从外部传进来的OnSubscribe
参数,
最终也会通过new
调用Observable
的构造方法,
最终传给Observable
的全局变量 onSubscribe
而关于
全局变量 Observable.OnSubscribe类型的对象 onSubscribe
,
我们刚刚提到,
可以对等地理解成是观察者模式
中,
被观察者
用来通知观察者
的notifyObservers()方法
;接着我们看源码中第一个
create()
的重载方法,
其最后都是return,返回
一个new调用构造方法创建好的Observable
对象;而在
create()
内部,
赋值给构造函数的参数是调用了一个hook.onCreate()
方法;
下面关注一下hook
,
可以看到关于hook
的定义——
static final RxJavaObservableExecutionHook hook = RxJavaPlugins.getInstance().getObservableExecutionHook();
事实上我们可以把hook
理解成为一个抽象的代理类对象
;
默认情况下,hook
不会的OnSubscribe
对象做任何的处理
;
一句话总结一下,
Observable
的就是通过代理类对象hook
创建的,
而默认情况下,hook
不会的OnSubscribe
对象做任何的处理
;
当然,默认不处理,
但是我们需要的话自然是可以个性化地重写这个方法的;
所以create()
所做的工作是,
构造一个新的Observable
对象,
同时借助Observable类
的原生构造方法,
将传进来的OnSubscribe
对象赋给类中的全局变量onSubscribe
;
如此便完成了被观察者Observable
的创建生成;
示例代码如下:
//第一步:创建被观察者:create Observable observable = Observable.create(new >Observable.OnSubscribe
() { @Override public void call(Subscriber super String> subscriber) { subscriber.onNext("Hello"); subscriber.onNext("Imooc"); subscriber.onCompleted(); } }); //通过just方法来创建被观察者 Observable observableJust = Observable.just("hello", "Imooc"); //通过from方法来创建被观察者 String[] parameters = {"hello", "Imooc"}; Observable observableFrom = Observable.from(parameters); 可以看到,创建
Observable
的实质,
就是new
一个OnSubscribe
接口并实现其call()方法
,
然后把实现了call()方法
的整个OnSubscribe
接口对象作为参数赋值给Observable
的create()方法
;
创建Observable 实例
之后,
会把这个OnSubscribe 对象参数
存到本Observable
示例的全局变量中;
等到回调call()方法
时候,
其实就是Observable.subscribe() - subscribe()中call()
,
这个call()方法
现在是“存储在”Observable 实例
中的方法,
也是方才传进来的,
实现了call()方法
的整个OnSubscribe
接口对象参数;!!!
这个地方实际上就跟onClick()的实现逻辑相当类似!
!!!
观察者创建
以及订阅
实例代码:
//第二步:创建观察者
Observer
- 第二步,创建
Observer
观察者对象;
这里有两个接口——Observer
和Subscriber
其实
Subscriber
内部也只对Observer
做了一些拓展,
它们两个的使用方式基本是相同的;
当然就是有一些回调接口
的差异;Rxjava内部最终会将
Observer
转换成Subscriber
;
接下来是Rxjava的SDK
中subscribe()
的传入参数
是Observer
时候(observable.subscribe(observer);
)的源码:
public final Subscription subscribe(final Observer super T> observer) {
if (observer instanceof Subscriber) {
return subscribe((Subscriber super T>)observer);
}
return subscribe(new Subscriber() {
@Override
public void onCompleted() {
observer.onCompleted();
}
@Override
public void onError(Throwable e) {
observer.onError(e);
}
@Override
public void onNext(T t) {
observer.onNext(t);
}
});
}
Rxjava的SDK
中subscribe()
的传入参数
是Subscriber
时候(observable.subscribe(subscriber);
)的源码:
public final Subscription subscribe(Subscriber super T> subscriber) {
return Observable.subscribe(subscriber, this);
}
- .
- 这里可以看到如果传给
subscribe()
的对象是Observer
,
则会在源码Rxjava的源码
中首先被转换成Subscriber
,
之后再进行后续操作;
也即应证了之前所说的Rxjava内部
最终会将Observer
转换成Subscriber
再进行后续处理;
- 这里可以看到如果传给
Subscriber源码分析
package rx;
import rx.internal.util.SubscriptionList;
public abstract class Subscriber implements Observer, Subscription {
// represents requested not set yet
private static final Long NOT_SET = Long.MIN_VALUE;
private final SubscriptionList subscriptions;
private final Subscriber> subscriber;
/* protected by `this` */
private Producer producer;
/* protected by `this` */
private long requested = NOT_SET; // default to not set
protected Subscriber() {
this(null, false);
}
protected Subscriber(Subscriber> subscriber) {
this(subscriber, true);
}
protected Subscriber(Subscriber> subscriber, boolean shareSubscriptions) {
this.subscriber = subscriber;
this.subscriptions = shareSubscriptions && subscriber != null ? subscriber.subscriptions : new SubscriptionList();
}
public final void add(Subscription s) {
subscriptions.add(s);
}
@Override
public final void unsubscribe() {
subscriptions.unsubscribe();
}
@Override
public final boolean isUnsubscribed() {
return subscriptions.isUnsubscribed();
}
public void onStart() {
// do nothing by default
}
protected final void request(long n) {
if (n < 0) {
throw new IllegalArgumentException("number requested cannot be negative: " + n);
}
// if producer is set then we will request from it
// otherwise we increase the requested count by n
Producer producerToRequestFrom = null;
synchronized (this) {
if (producer != null) {
producerToRequestFrom = producer;
} else {
addToRequested(n);
return;
}
}
// after releasing lock (we should not make requests holding a lock)
producerToRequestFrom.request(n);
}
private void addToRequested(long n) {
if (requested == NOT_SET) {
requested = n;
} else {
final long total = requested + n;
// check if overflow occurred
if (total < 0) {
requested = Long.MAX_VALUE;
} else {
requested = total;
}
}
}
public void setProducer(Producer p) {
long toRequest;
boolean passToSubscriber = false;
synchronized (this) {
toRequest = requested;
producer = p;
if (subscriber != null) {
// middle operator ... we pass through unless a request has been made
if (toRequest == NOT_SET) {
// we pass through to the next producer as nothing has been requested
passToSubscriber = true;
}
}
}
// do after releasing lock
if (passToSubscriber) {
subscriber.setProducer(producer);
} else {
// we execute the request with whatever has been requested (or Long.MAX_VALUE)
if (toRequest == NOT_SET) {
producer.request(Long.MAX_VALUE);
} else {
producer.request(toRequest);
}
}
}
}
public abstract class Subscriber implements Observer, Subscription {...
Subscriber
实现了Observer
、Subscription
两个接口;
Observer
接口即前面所提的另一个观察者接口
;-
Subscription
源码unsubscribe():解绑;
当“订阅事件的列表”
(也即当前观察者
中的一个放着所有订阅事件的列表
的成员变量
)
之中不再有订阅事件时,
调用这个方法来对“订阅事件列表”进行解绑;isUnsubscribed():判断是否已经解绑订阅事件;
package rx;
import rx.subscriptions.Subscriptions;
public interface Subscription {
void unsubscribe();
boolean isUnsubscribed();
}
-
private final SubscriptionList subscriptions;
这个List
即前面unsubscribe()
中提到的“订阅事件的列表”;
其中包含的是观察者所有的订阅事件
;
当Subscriber 取消订阅
的时候,
这个List
中就会有事件
被删除
(得益于实现了Subscription
接口);
当这个List
中没有任何事件
了,
即列表中所有的事件都被取消订阅了;
那么这个List
也就为空
;
以上则是Subscriber
的核心逻辑;
第三步,下面具体分析订阅
的实现
下面小结一下,
call()
方法在subscribe()
方法之中被调用
(从下面subscribe()
方法的源码中可以见得),
也即默认subscribe()
方法被调用之后
(observable.subscribe(observer);
或者observable.subscribe(subscriber);
),
会触发
在创建Observable
时候实现的OnSubscribe<>
中的call()
方法,
完成回调;
call()
方法中可以实现一系列事件消费的过程
——onNext()、onCompleted()
等;
observable
中调用了onNext、onCompleted()
的时候,
相应订阅了的Observer/Subscriber
中的onNext、onCompleted()
也就被调用执行
;//第一步:创建被观察者:create Observable observable = Observable.create(new >Observable.OnSubscribe
() { @Override public void call(Subscriber super String> subscriber) { subscriber.onNext("Hello"); subscriber.onNext("Imooc"); subscriber.onCompleted(); } }); //通过just方法来创建被观察者 Observable observableJust = Observable.just("hello", "Imooc"); //通过from方法来创建被观察者 String[] parameters = {"hello", "Imooc"}; Observable observableFrom = Observable.from(parameters); 以上便是Rxjava
最基本的使用方式
;
Rxjava的SDK
中subscribe()
的传入参数
是Subscriber
时候(observable.subscribe(subscriber);
)的源码:
public final Subscription subscribe(Subscriber super T> subscriber) {
return Observable.subscribe(subscriber, this);
}
可以看到
Subscription subscribe()
中,
又调用了另外一个“同名的订阅方法”Observable.subscribe()
,
传入的是subscriber
和this
两个参数;-
跟进
Observable.subscribe()
的源码:
private static Subscription subscribe(Subscriber super T> subscriber, Observable observable) {
if (subscriber == null) {
throw new IllegalArgumentException("observer can not be null");
}
if (observable.onSubscribe == null) {
throw new IllegalStateException("onSubscribe function can not be null.");
}
subscriber.onStart();
if (!(subscriber instanceof SafeSubscriber)) {
subscriber = new SafeSubscriber(subscriber);
}
try {
hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);
return hook.onSubscribeReturn(subscriber);
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
try {
subscriber.onError(hook.onSubscribeError(e));
} catch (Throwable e2) {
Exceptions.throwIfFatal(e2);
RuntimeException r = new RuntimeException("Error occurred attempting to subscribe [" + e.getMessage() + "] and then again while trying to pass to onError.", e2);
hook.onSubscribeError(r);
throw r;
}
return Subscriptions.unsubscribed();
}
}
- 首先是对
subscriber
和observable.onSubscribe
判空,
空则抛出异常;
if (subscriber == null) {... }
if (observable.onSubscribe == null) {...}
接着,
subscriber.onStart();
,
跟进一下onStart()
,
可以发现它其实是Subscriber
类中的一个空方法;
默认什么都不做,需要我们自己调用的时候去实现;要把传进来的
subscriber
包装成SafeSubscriber
来进行后续操作,
而这个SafeSubscriber
其实就是比subscriber
多做了一系列更完善的处理,
当然它也包含了subscriber
拥有的onCompleted()
、onError()
等方法:
if (!(subscriber instanceof SafeSubscriber)) {
subscriber = new SafeSubscriber(subscriber);
}
-
hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);
return hook.onSubscribeReturn(subscriber);
接着我们可以看到源码以subscriber
为参数,
调用了call()
回调方法;
调用完了call()
方法,
意味着完成了一次订阅
;
接着通过代理类hook
将subscriber
以Subscription
的类型返回
(public
)Subscription onSubscribeReturn(Subscription subscription) {...}
(此处subscriber对象
向上转型,
当成接口Subscription
类型使用,
因为Subscriber类
实现了接口Subscription
,乃其子类
);
前面提到过,
接口Subscription
是每一个观察者Subscriber
必须实现的接口,
同时Subscriber
的实例都有一个SubscriptionList
,
这个List
包含的是观察者所有的订阅事件;
至此便完成了Subscriber
核心的主要的订阅流程
;
-
跟进
SafeSubscriber
源码:
public class SafeSubscriber extends Subscriber {
private final Subscriber super T> actual;
boolean done = false;
public SafeSubscriber(Subscriber super T> actual) {
super(actual);
this.actual = actual;
}
@Override
public void onCompleted() {
if (!done) {
done = true;
try {
actual.onCompleted();
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
RxJavaPluginUtils.handleException(e);
throw new OnCompletedFailedException(e.getMessage(), e);
} finally {
try {
unsubscribe();
} catch (Throwable e) {
RxJavaPluginUtils.handleException(e);
throw new UnsubscribeFailedException(e.getMessage(), e);
}
}
}
}
@Override
public void onError(Throwable e) {
Exceptions.throwIfFatal(e);
if (!done) {
done = true;
_onError(e);
}
}
@Override
public void onNext(T args) {
try {
if (!done) {
actual.onNext(args);
}
} catch (Throwable e) {
Exceptions.throwOrReport(e, this);
}
}
protected void _onError(Throwable e) {
RxJavaPluginUtils.handleException(e);
try {
actual.onError(e);
} catch (Throwable e2) {
if (e2 instanceof OnErrorNotImplementedException) {
try {
unsubscribe();
} catch (Throwable unsubscribeException) {
RxJavaPluginUtils.handleException(unsubscribeException);
throw new RuntimeException("Observer.onError not implemented and error while unsubscribing.", new CompositeException(Arrays.asList(e, unsubscribeException)));
}
throw (OnErrorNotImplementedException) e2;
} else {
RxJavaPluginUtils.handleException(e2);
try {
unsubscribe();
} catch (Throwable unsubscribeException) {
RxJavaPluginUtils.handleException(unsubscribeException);
throw new OnErrorFailedException("Error occurred when trying to propagate error to Observer.onError and during unsubscription.", new CompositeException(Arrays.asList(e, e2, unsubscribeException)));
}
throw new OnErrorFailedException("Error occurred when trying to propagate error to Observer.onError", new CompositeException(Arrays.asList(e, e2)));
}
}
try {
unsubscribe();
} catch (RuntimeException unsubscribeException) {
RxJavaPluginUtils.handleException(unsubscribeException);
throw new OnErrorFailedException(unsubscribeException);
}
}
public Subscriber super T> getActual() {
return actual;
}
}
从源码可以看到
SafeSubscriber类
中,
也有onCompleted() 、onError()、onNext()
等方法;
它就是对subscriber类
做了一个包装;注意
onCompleted() 或者onError()
方法被执行的时候,
就不会再执行onNext()
(注意布尔变量done
);
(因完成状态/Completed
或者异常状态/Error
发生后,
就没必要在进行下一步/Next
的操作了)
(onComplete()
和onError()
是互斥的,
也就是一次只能调用其中一个,不能同时调用)
参考自 慕课网