RxJava之defer操作符

原创 2016年05月31日 08:27:34

Defer操作符

1. 作用

defer 操作符与create、just、from等操作符一样,是创建类操作符,不过所有与该操作符相关的数据都是在订阅是才生效的。

2. 用法:

    i = 12;
    //注意此处defer的参数是Func0,而不是OnSubscrie
    Observable observable = Observable.defer(new Func0<Observable<Integer>>(){
        @Override
        //注意此处的call方法没有Subscriber参数
        public Observable<Integer> call(){
            return new Observable.from(i);
        }
    });

    i = 15;

    observable.subscribe(new Action1<Integer>(){
        @Override
        public void call(Integer i){
            System.out.println("integer = [" + integer + "]");
        }
    })

这段代码的输出为: integer = [15]

3. 事件流分析

相关类:OnSubscribeDefer,其具体流程如下:
1. 产生Observable对象;注意此处defer的参数是Func0,调用defer之后,继续讲Func0当做参数创建ObSubscribeDefer实例。

    Observable.defer(new Func0<Observable<Integer>>(){
        @Override
        //注意此处的call方法没有Subscriber参数
        public Observable<Integer> call(){
            return new Observable.from(i);
        }
    });

2.订阅 ;当产生订阅关系时,将会调用1中的OnSubscribeDefer实例的call方法,再call方法中调用func0的call方法,所以所有该Observable所用到的数据都是在离调用subscribe最近的地方的数值。

    observable.subscribe(new Action1<Integer>(){
        public void call(Subscriber subscriber){
            //do Something
        }
    }

总结:defer操作符相对简单,将Func1的实例当做参数去构建OnSubscribeDefer对象,在发生订阅关系时,再去回调func1.call();

思考

不管使用基本的create还是just、from或defer,在OnSubscribe(或Observer、Subscriber)的call方法结束完毕(或者future得到callable的数据之后),是如何唤起Observer的call方法、complete方法甚至onError方法的呢?

  1. create操作在call方法结束之后,需要手动调用subscriber.next()或subscriber.complete()方法。
  2. just,from或defer都是在producer中调用的onComplete、onNext、onError方法。
  3. future,首先ObSubscribeToObservableFuture.call方法,在该方法中,当future取到callable的返回值后,将回调onNext、onComplete、OnError方法。

Android RxJava使用介绍(二) RxJava的操作符

上一篇文章我们通过一个简单的例子来给大家展示了RxJava的基本用法,相信大家已经对RxJava有了大概的了解,由于上篇文章对RxJava的使用介绍都是点到为止,并没有进行深入展开,也许你对RxJav...
  • Job_Hesc
  • Job_Hesc
  • 2015年06月03日 23:56
  • 26791

[Android开发] RxJava2之路二 - 基本使用方法

一、啥是RXJava1.1 简介 一个在Java Jvm上使用可观测的序列来组成异步的、基于事件的程序的库。 概念很复杂,没所谓。我们先学会使用。RxJava github地址: https:/...

RxJava2总结之操作详解(一)

目录目录 创建操作 create just empty never error timer range intervalRange interval defer from系列 fromArray fr...

RxJava(十一)defer操作符实现代码支持链式调用

前言现在越来越多Android开发者使用到RxJava,在Android使用RxJava主要有如下好处: 1,轻松切换线程。以前我们切换线程主要使用Handler等手段来做。 2,轻松解决回调的嵌...

利用Eclipse或AndroidStudio的代码模板,自动生成 Log.e(TAG,"类名.方法名. msg"); 格式的代码

开发过程里打印Log经常要表明Log所在的类和方法, 比如:  Log.e(TAG,"MainActivity.onResume. Are you ok?"); 以前每次都是手打或复制,前段...

Chrome postman插件用来测试http 接口

Chrome 有个浏览器插件叫PostMan的 ,用来测试http api 接口非常方便。    1. 首先去 google Chrome 的 插件管理页面 ,搜索下载 PostMan        ...

RxJava 操作符--defer

原文作者: [Dan Lew] 文章链接: [ Deferring Observable code until subscription in RxJava]正文延迟Observable代码运行...

RX操作符之Observable的创建方式二(defer、range、interval、timer、Empty、Never、Throw)

一、defer Defer操作符会一直等待直到有观察者订阅它,然后它使用Observable工厂方法生成一个Observable。它对每个观察者都这样做,因此尽管每个订阅者都以为自己订阅的是同一个O...

【RxJava Demo分析】(一)just、error、defer和CompositeSubscription

前言RxJava可能是目前最难以掌握的库之一,面对大量的书籍和理论讲解,我选择结合项目来进行理解和记录。本系列教程是基于Github开源项目RxJava-Android-Samples 进行分析。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RxJava之defer操作符
举报原因:
原因补充:

(最多只允许输入30个字)