RxJava基础-创建操作符

前言:上篇文章我们讲解了RxJava最基本的基础知识原理,这篇呢我打算讲解下怎么来创建一个observable被观察者,各个api的使用情况。

一.创建操作符

1.基本创建:create()

RxJava中最基本的创建被观察者(Observable)的操作符

  • 具体使用

         /**
         * 通过Observable.create()来创建一个被观察者
         */
        Observable observable=Observable.create(new ObservableOnSubscribe<String>() {
            /**
             * 在复写的subscribe方法中定义要发送的事件
             * @param e
             * @throws Exception
             */
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                //在这个方法里面开始向外发射事件
                e.onNext("hello");
                e.onNext("RxJava");
                e.onComplete();
            }
        });        
        
        这样一个被观察者(ObServable)就被创建出来了,接下来我们用完整的链式将这个Observable订阅起来使用
        
         /**
         * 通过Observable.create()来创建一个被观察者
         */
        Observable.create(new ObservableOnSubscribe<String>() {
            /**
             * 在复写的subscribe方法中定义要发送的事件
             * @param e
             * @throws Exception
             */
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                //在这个方法里面开始向外发射事件
                e.onNext("hello");
                e.onNext("RxJava");
                e.onComplete();
            }
        }).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "开始采用subscribe连接");
            }
    
            @Override
            public void onNext(String s) {
                Log.d(TAG,"接收结果:"+s);
            }
    
            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "对Error事件作出响应");
            }
    
            @Override
            public void onComplete() {
                Log.d(TAG, "对Complete事件作出响应");
            }
        });
    
        打印结果如下:
        04-26 19:58:53.100 11189-11189/? D/MainTwoActivity: 开始采用subscribe连接
        04-26 19:58:53.100 11189-11189/? D/MainTwoActivity: 接收结果:hello
        04-26 19:58:53.100 11189-11189/? D/MainTwoActivity: 接收结果:RxJava
        04-26 19:58:53.100 11189-11189/? D/MainTwoActivity: 对Complete事件作出响应
    

2.快速创建&发送事件

2.1 just():
  • 快速创建一个被观察者对象(observable)

  • 发送事件的特点:直接发送 传入的事件

  • 最多只能发送10个参数

  • 具体使用:

         // 1. 创建时传入整型1、2、3、4
        // 在创建后就会发送这些对象,相当于执行了onNext(1)、onNext(2)、onNext(3)、onNext(4)
        Observable.just(1, 2, 3,4)   
            // 至此,一个Observable对象创建完毕,以下步骤仅为展示一个完整demo,可以忽略
            // 2. 通过通过订阅(subscribe)连接观察者和被观察者
            // 3. 创建观察者 & 定义响应事件的行为
         .subscribe(new Observer<Integer>() {
            
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "开始采用subscribe连接");
            }
            // 默认最先调用复写的 onSubscribe()
    
            @Override
            public void onNext(Integer value) {
                Log.d(TAG, "接收到了事件"+ value  );
            }
    
            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "对Error事件作出响应");
            }
    
            @Override
            public void onComplete() {
                Log.d(TAG, "对Complete事件作出响应");
            }
    
        });
    }
    
    打印结果:
    04-27 00:42:48.403 13505-13505/? D/MainTwoActivity: 开始采用subscribe连接
    04-27 00:42:48.403 13505-13505/? D/MainTwoActivity: 接收到了事件1
    04-27 00:42:48.403 13505-13505/? D/MainTwoActivity: 接收到了事件2
    04-27 00:42:48.403 13505-13505/? D/MainTwoActivity: 接收到了事件3
    04-27 00:42:48.403 13505-13505/? D/MainTwoActivity: 接收到了事件4
    04-27 00:42:48.403 13505-13505/? D/MainTwoActivity: 对Complete事件作出响应
    
2.2 fromArray():
  • 快速创建1个被观察者对象(Observable)

  • 发送事件的特点:直接发送 传入的数组数据 (会将数组中的数据转换为Observable对象)

  • 没有限制个数

  • 具体demo使用如下:

        // 1. 创建时传入整型1、2、3、4
        // 在创建后就会发送这些对象,相当于执行了onNext(1)、onNext(2)、onNext(3)、onNext(4)
        Observable.fromArray(1, 2, 3, 4,5,6,7,8,9,10,11,12,13)
                // 至此,一个Observable对象创建完毕,以下步骤仅为展示一个完整demo,可以忽略
                // 2. 通过通过订阅(subscribe)连接观察者和被观察者
                // 3. 创建观察者 & 定义响应事件的行为
                .subscribe(new Observer<Integer>() {
    
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "开始采用subscribe连接");
                    }
                    // 默认最先调用复写的 onSubscribe()
    
                    @Override
                    public void onNext(Integer value) {
                        Log.d(TAG, "接收到了事件" + value);
                    }
    
                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "对Error事件作出响应");
                    }
    
                    @Override
                    public void onComplete() {
                        Log.d(TAG, "对Complete事件作出响应");
                    }
    
                });
    
    打印结果如下:
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 开始采用subscribe连接
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 接收到了事件1
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 接收到了事件2
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 接收到了事件3
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 接收到了事件4
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 接收到了事件5
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 接收到了事件6
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 接收到了事件7
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 接收到了事件8
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 接收到了事件9
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 接收到了事件10
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 接收到了事件11
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 接收到了事件12
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 接收到了事件13
    04-27 00:48:59.468 13653-13653/? D/MainTwoActivity: 对Complete事件作出响应
    
2.3 formIterable():
  • 快速创建1个被观察者对象(Observable)

  • 发送事件的特点:直接发送 传入的集合List数据

  • 没有限制个数

  • 具体demo使用如下:

       // 1. 设置一个集合
       List<Integer> list = new ArrayList<>();
       list.add(1);
       list.add(2);
       list.add(3);
       // 在创建后就会发送这些对象,相当于执行了onNext(1)、onNext(2)、onNext(3)、onNext(4)
       Observable.fromIterable(list)
               // 至此,一个Observable对象创建完毕,以下步骤仅为展示一个完整demo,可以忽略
               // 2. 通过通过订阅(subscribe)连接观察者和被观察者
               // 3. 创建观察者 & 定义响应事件的行为
               .subscribe(new Observer<Integer>() {
    
                   @Override
                   public void onSubscribe(Disposable d) {
                       Log.d(TAG, "开始采用subscribe连接");
                   }
                   // 默认最先调用复写的 onSubscribe()
    
                   @Override
                   public void onNext(Integer value) {
                       Log.d(TAG, "接收到了事件" + value);
                   }
    
                   @Override
                   public void onError(Throwable e) {
                       Log.d(TAG, "对Error事件作出响应");
                   }
    
                   @Override
                   public void onComplete() {
                       Log.d(TAG, "对Complete事件作出响应");
                   }
    
               });
    
     打印结果:
    04-27 00:53:14.695 13773-13773/? D/MainTwoActivity: 开始采用subscribe连接
    04-27 00:53:14.695 13773-13773/? D/MainTwoActivity: 接收到了事件1
    04-27 00:53:14.695 13773-13773/? D/MainTwoActivity: 接收到了事件2
    04-27 00:53:14.695 13773-13773/? D/MainTwoActivity: 接收到了事件3
    04-27 00:53:14.695 13773-13773/? D/MainTwoActivity: 对Complete事件作出响应
    

3.延迟创建

3.1 defer():
  • 直到有观察者(Observer )订阅时,才动态创建被观察者对象(Observable) & 发送事件

  • 通过 Observable工厂方法创建被观察者对象(Observable)

  • 每次订阅后,都会得到一个刚创建的最新的Observable对象,这可以确保Observable对象里的数据是最新的

  • 具体demo使用:

    <-- 1. 第1次对i赋值 ->>
        Integer i = 10;
    
        // 2. 通过defer 定义被观察者对象
        // 注:此时被观察者对象还没创建
        Observable<Integer> observable = Observable.defer(new Callable<ObservableSource<? extends Integer>>() {
            @Override
            public ObservableSource<? extends Integer> call() throws Exception {
                return Observable.just(i);
            }
        });
    
        <-- 2. 第2次对i赋值 ->>
        i = 15;
    
        <-- 3. 观察者开始订阅 ->>
        // 注:此时,才会调用defer()创建被观察者对象(Observable)
        observable.subscribe(new Observer<Integer>() {
    
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "开始采用subscribe连接");
            }
    
            @Override
            public void onNext(Integer value) {
                Log.d(TAG, "接收到的整数是"+ value  );
            }
    
            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "对Error事件作出响应");
            }
    
            @Override
            public void onComplete() {
                Log.d(TAG, "对Complete事件作出响应");
            }
        });
    
    打印结果:最后打印的值15:因为每次订阅后,都会得到一个刚创建的最新的Observable对象,这可以确保Observable对象里的数据是最新的,所以i值会取第2次的赋值
    
    04-27 01:00:55.319 13898-13898/lingan.test.com.myapplication D/MainTwoActivity: 开始采用subscribe连接
    04-27 01:00:55.319 13898-13898/lingan.test.com.myapplication D/MainTwoActivity: 接收到的整数是15
    04-27 01:00:55.319 13898-13898/lingan.test.com.myapplication D/MainTwoActivity: 对Complete事件作出响应
    
    
3.2 timer():
  • 快速创建1个被观察者对象(Observable)

  • 发送事件的特点:延迟指定时间后,发送1个数值0(Long类型)

  • 本质 = 延迟指定时间后,调用一次 onNext(0) 延迟指定事件,发送一个0,一般用于检测

  • 具体demo使用:

    Observable.timer(10, TimeUnit.SECONDS).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG,"onSubscribe: ");
            }
    
            @Override
            public void onNext(Long aLong) {
                Log.d(TAG,"onNext: "+aLong);
            }
    
            @Override
            public void onError(Throwable e) {
                Log.d(TAG,"onError: ");
            }
    
            @Override
            public void onComplete() {
                Log.d(TAG,"onComplete: ");
            }
        });
    
    打印结果:.645 19748-19763/lingan.test.com.myapplication D/MainActivity: onNext: 0
    

3.3 interval():

  • 快速创建1个被观察者对象(Observable)

  • 发送事件的特点:每隔指定时间 就发送 事件

  • 发送的事件序列 = 从0开始、无限递增1的的整数序列

  • 具体demo使用测试:

    Observable.interval(10,5, TimeUnit.SECONDS).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG,"onSubscribe: ");
            }
    
            @Override
            public void onNext(Long aLong) {
                Log.d(TAG,"onNext: "+aLong);
            }
    
            @Override
            public void onError(Throwable e) {
                Log.d(TAG,"onError: ");
            }
    
            @Override
            public void onComplete() {
                Log.d(TAG,"onComplete: ");
            }
        });
    
    打印结果:第一次间隔10秒开始发送一次事件,第一次事件值为0,然后每次间隔5秒发送一次事件,每次事件值增加1
    

3.4 intervalRange():

  • 快速创建1个被观察者对象(Observable)

  • 发送事件的特点:每隔指定时间 就发送 事件,可指定发送的数据的数量

  • 发送的事件序列 = 从指定一个数开始、无限递增1的的整数序列,到指定的第二个参数大小停止

  • 作用类似于interval(),但可指定发送的数据的数量

  • 具体demo使用

    Observable.intervalRange(1,10,10,5, TimeUnit.SECONDS).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG,"onSubscribe: ");
            }
    
            @Override
            public void onNext(Long aLong) {
                Log.d(TAG,"onNext: "+aLong);
            }
    
            @Override
            public void onError(Throwable e) {
                Log.d(TAG,"onError: ");
            }
    
            @Override
            public void onComplete() {
                Log.d(TAG,"onComplete: ");
            }
        });
    
    打印结果:发送事件值1开始叠加,最大发送10次,第一次间隔10秒开始发送,第二次是每次间隔5秒开始
    04-14 02:48:30.422 20204-20219/lingan.test.com.myapplication D/MainActivity: onNext: 1
    04-14 02:48:35.421 20204-20219/lingan.test.com.myapplication D/MainActivity: onNext: 2
    04-14 02:48:40.421 20204-20219/lingan.test.com.myapplication D/MainActivity: onNext: 3
    04-14 02:48:45.421 20204-20219/lingan.test.com.myapplication D/MainActivity: onNext: 4
    04-14 02:48:50.422 20204-20219/lingan.test.com.myapplication D/MainActivity: onNext: 5
    04-14 02:48:55.422 20204-20219/lingan.test.com.myapplication D/MainActivity: onNext: 6
    04-14 02:49:00.421 20204-20219/lingan.test.com.myapplication D/MainActivity: onNext: 7
    04-14 02:49:05.422 20204-20219/lingan.test.com.myapplication D/MainActivity: onNext: 8
    04-14 02:49:10.421 20204-20219/lingan.test.com.myapplication D/MainActivity: onNext: 9
    04-14 02:49:15.421 20204-20219/lingan.test.com.myapplication D/MainActivity: onNext: 10
    04-14 02:49:15.422 20204-20219/lingan.test.com.myapplication D/MainActivity: onComplete:
    

3.5 range():

  • 快速创建1个被观察者对象(Observable)

  • 发送事件的特点:连续发送 1个事件序列,可指定范围

  • 发送的事件序列 = 从指定一个数开始、无限递增1的的整数序列,到指定的第二个参数大小停止

  • 作用类似于intervalRange(),但区别在于:无延迟发送事件

  • 具体demo使用

    Observable.range(1,10).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG,"onSubscribe: ");
            }
    
            @Override
            public void onNext(Integer aLong) {
                Log.d(TAG,"onNext: "+aLong);
            }
    
            @Override
            public void onError(Throwable e) {
                Log.d(TAG,"onError: ");
            }
    
            @Override
            public void onComplete() {
                Log.d(TAG,"onComplete: ");
            }
        }); 
        
    
    打印结果:没有延迟,快速打印出1到10的值。
    04-14 02:52:32.563 20305-20305/? D/MainActivity: onSubscribe: 
    04-14 02:52:32.564 20305-20305/? D/MainActivity: onNext: 1
    04-14 02:52:32.564 20305-20305/? D/MainActivity: onNext: 2
    04-14 02:52:32.564 20305-20305/? D/MainActivity: onNext: 3
    04-14 02:52:32.564 20305-20305/? D/MainActivity: onNext: 4
    04-14 02:52:32.564 20305-20305/? D/MainActivity: onNext: 5
    04-14 02:52:32.564 20305-20305/? D/MainActivity: onNext: 6
    04-14 02:52:32.564 20305-20305/? D/MainActivity: onNext: 7
    04-14 02:52:32.564 20305-20305/? D/MainActivity: onNext: 8
    04-14 02:52:32.564 20305-20305/? D/MainActivity: onNext: 9
    04-14 02:52:32.564 20305-20305/? D/MainActivity: onNext: 10
    04-14 02:52:32.564 20305-20305/? D/MainActivity: onComplete:
    

3.6 rangeLong():

  • 作用:类似于range(),区别在于该方法支持数据类型 = Long
  • 与range()类似,此处不作过多描述至此.

总结:基本常用的创建符就是这几种,非常简单,下篇文章会讲解下,RxJava的转换操作符。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容