Rxjava Obserable的创建操作符

创建操作符目录

creating_observables.png

由ReactiveX: http://reactivex.io/documentation/operators.html 支持。

1: Create

Create操作符: 使用OnSubscribe从头创建一个Observable。OnSubscribe会在订阅发生时,调用内部的call方法,实现调用onnext等方法。

Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("hello Rxjava");
            }
        }).subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "onCompleted: ");
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "onError: ");
            }

            @Override
            public void onNext(String s) {
                Log.d(TAG, "onNext: "+s);
            }
        });

结果:

03-15 16:35:18.191 27050-27050/com.nnews D/RxOperatorsTest: onNext: hello Rxjava

Observable.create中传入OnSubscribe作为对象,当Observable.subscribe()订阅时,会调用OnSubscribe的回调方法Call, 然后可以在Call方法中通过参数subscriber观察者的onNext(), onError(), onCompleted()等方法执行,就传递到订阅的观察者回调方法中。

看图:

create.c.png

create() 方法是 RxJava 最基本的创造事件序列的方法,

2: Just

just操作符:将指定类型的object创建为Observable对象,按照顺序发射给Observer,调用onNext(),onNext()...,最后onComplete()

Observable.just("111","222").subscribe(new Action1<String>() {
            @Override
            public void call(String string) {
                Log.d(TAG, "call: "+string+",Thead="+Thread.currentThread().getName());
            }
        });

结果:

03-15 16:27:47.644 18868-18868/com.nnews D/RxOperatorsTest: call: 111,Thead=main
03-15 16:27:47.644 18868-18868/com.nnews D/RxOperatorsTest: call: 222,Thead=main
just.c.png

源码:

public static <T> Observable<T> just(T t1, T t2) {
        return from((T[])new Object[] { t1, t2 });
    }

可以看出,调用了from的方法,下面介绍from

3:From

From操作符:将传入的数组或 Iterable 拆分成具体对象Observable后,依次发射出来,调用onNext(), onNext() ..., 最后onComplete()

        String[] mArray = {"111","222"};
        Observable.from(mArray)
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.d(TAG, "call: "+s+",Thead="+Thread.currentThread().getName());
                    }
                });

结果:

03-15 16:48:28.389 10123-10123/com.nnews D/RxOperatorsTest: call: 111,Thead=main
03-15 16:48:28.389 10123-10123/com.nnews D/RxOperatorsTest: call: 222,Thead=main

源码:

public static <T> Observable<T> from(T[] array) {
        int n = array.length;
        if (n == 0) {
            return empty();
        } else
        if (n == 1) {
            return just(array[0]);
        }
        return create(new OnSubscribeFromArray<T>(array));
    }

可以看出,最后调用了create方法,到这里明白了,just,from操作符最终都是调用create操作符实现的!

from.c.png

4: Interval

Interval操作符:创建一个按照一定时间间隔, 发射出来的Observable.

场景:定时去获取推送接口的消息,提通知用户

Observable.interval(2, TimeUnit.SECONDS)
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        Log.d(TAG, "call: "+aLong+",Thead="+Thread.currentThread().getName());
                    }
                });

结果:

03-15 17:05:51.383 28561-28621/com.nnews D/RxOperatorsTest: call: 0,Thead=RxComputationScheduler-1
03-15 17:05:53.383 28561-28621/com.nnews D/RxOperatorsTest: call: 1,Thead=RxComputationScheduler-1
03-15 17:05:55.383 28561-28621/com.nnews D/RxOperatorsTest: call: 2,Thead=RxComputationScheduler-1
03-15 17:05:57.383 28561-28621/com.nnews D/RxOperatorsTest: call: 3,Thead=RxComputationScheduler-1
03-15 17:05:59.383 28561-28621/com.nnews D/RxOperatorsTest: call: 4,Thead=RxComputationScheduler-1
03-15 17:06:01.383 28561-28621/com.nnews D/RxOperatorsTest: call: 5,Thead=RxComputationScheduler-1

可以看到,每隔2秒,打印一次,注意到不是工作在主线程了哦!

interval相当于定时器,定时创建Obserable,然后发射, 调用onNext()...

interval.c.png

5:Range

range操作符: 根据初始值n和数目m, 发射n,n+1,n+2...,n+m-1,范围的数值

Android场景:获取数据的前20条展示等

Sample:

Observable.range(16,3)
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.d(TAG, "call: "+integer+",Thead="+Thread.currentThread().getName());
                    }
                });

结果:

03-15 17:20:38.929 13010-13010/com.nnews D/RxOperatorsTest: call: 16,Thead=main
03-15 17:20:38.929 13010-13010/com.nnews D/RxOperatorsTest: call: 17,Thead=main
03-15 17:20:38.929 13010-13010/com.nnews D/RxOperatorsTest: call: 18,Thead=main
range.c.png

6: Repeat

repeat操作符:创建一个observable,然后重复发射n次

Observable.just("1")
                .repeat(5)
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {
                        Log.d(TAG, "onCompleted: ");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError: ");
                    }

                    @Override
                    public void onNext(String s) {
                        Log.d(TAG, "onNext: "+s);
                    }
                });

结果:

03-15 17:26:32.157 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.158 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.158 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.159 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.159 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.159 19799-19799/com.nnews D/RxOperatorsTest: onCompleted: 
repeat.c.png

7: Timer

timer操作符既可以延迟执行一段逻辑,也可以间隔执行一段逻辑。

场景: Android 实际中,app开启时,延时加载初始化数据,然后跳到新页面

**Sample: **

/***
         * 延时5秒,app启动时,加载图片,然后开启新页面
         */
        Observable.timer(5, TimeUnit.SECONDS)
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        mActivity.startActivity(new Intent(mActivity, newActivity));
                    }
                });

第二个方法,还可以调度线程


Paste_Image.png
Paste_Image.png

8.empty/Never/Throw

Empty:创建一个不发射任何数据但是正常终止的Observable, 只调用onComplete方法

Paste_Image.png

Never:创建一个不发射数据也不终止的Observable, 不调用observer的方法

Paste_Image.png

Throw :创建一个不发射数据以一个错误终止的Observable,只调用onError方法

Paste_Image.png

总结:上述的创建操作符看源码会发现,最终都是创建Observale然后发射给observer,由被观察者调用了观察者的回调方法,就实现了由被观察者向观察者的事件传递,即观察者模式。

到这里常用的 “创建操作符” 就好了,有时看了还是人家的,多敲敲代码,看看Api,成为自己的,用到项目中,实现它的价值!

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

推荐阅读更多精彩内容

  • 作者: maplejaw本篇只解析标准包中的操作符。对于扩展包,由于使用率较低,如有需求,请读者自行查阅文档。 创...
    maplejaw_阅读 45,600评论 8 93
  • 本篇文章介主要绍RxJava中操作符是以函数作为基本单位,与响应式编程作为结合使用的,对什么是操作、操作符都有哪些...
    嘎啦果安卓兽阅读 2,835评论 0 10
  • 注:只包含标准包中的操作符,用于个人学习及备忘参考博客:http://blog.csdn.net/maplejaw...
    小白要超神阅读 2,184评论 2 8
  • 注:只包含标准包中的操作符,用于个人学习及备忘参考博客:http://blog.csdn.net/maplejaw...
    小白要超神阅读 906评论 0 3
  • 今天是七夕,也是你在他身边工作的第二年。 2014年他从国外回来,你便一直在他身边工作。你知道这个机会来之不易,所...
    Daosy_氵阅读 381评论 0 1