RxJava 源码解析 —— Observable#defer(...)

摘要: 原创出处 http://www.iocoder.cn/RxJava/observable-defer/ 「芋道源码」欢迎转载,保留摘要,谢谢!

本文主要基于 RxJava 1.2.X 版本

本系列写作目的,为了辅助 Hystrix 的理解,因此会较为零散与琐碎,望见谅见谅。

在一些业务场景下,我们需要 Observable 是动态的,例如说,《Hystrix 源码解析 —— 执行结果缓存》 分享的缓存 Observable ,无法在创建 Observable 阶段就知道是否有缓存,通过 Observable#defer(...) 方法,声明动态的 Observable 。示例代码如下:

      
      
public static void main(String[] args) {
Observable.defer( new Func0<Observable<String>>() { // #defer(...)
@Override
public Observable<String> call() {
String name = Math.random() > 0.5 ? "小明" : "小贾"; // 随机名字
return Observable.just(name);
}
}).subscribe( new Action1<String>() { // #subscribe(...)
@Override
public void call(String s) {
System.out.println(s);
}
});
}


Observable#defer(...) 方法,代码如下:

      
      
// Observable.java
public static <T> Observable<T> defer(Func0<Observable<T>> observableFactory) {
return create( new OnSubscribeDefer<T>(observableFactory));
}
public static <T> Observable<T> create(OnSubscribe<T> f) {
return new Observable<T>(RxJavaHooks.onCreate(f));
}

  • 使用传入 observableFactory 参数,生成动态的 Observable 。

OnSubscribeDefer 类,代码如下:

      
      
public final class OnSubscribeDefer<T> implements OnSubscribe<T> {
final Func0<? extends Observable<? extends T>> observableFactory;
public OnSubscribeDefer(Func0<? extends Observable<? extends T>> observableFactory) {
this.observableFactory = observableFactory;
}
@Override
public void call(final Subscriber<? super T> s) {
Observable<? extends T> o;
try {
o = observableFactory.call();
} catch (Throwable t) {
Exceptions.throwOrReport(t, s);
return;
}
o.unsafeSubscribe(Subscribers.wrap(s));
}
}

  • Observable#subscribe(...) 方法调用时,调用 OnSubscribeDefer#call(...) 方法 :
    • 调用 Func0#call() 方法,创建动态的 Observable 。
    • 调用 Observable#unsafeSubscribe(...) 方法,继续订阅逻辑

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值