RxJava2.x 常用操作符(1)——Cretae 创建操作

1.Create 创建操作

create( ) — 使用一个函数从头创建一个 Observable。
defer( ) — 只有当订阅者订阅才创建 Observable;为每个订阅创建一个新的 Observable。
empty( ) — 创建一个什么都不做直接通知完成的 Observable。
error( ) — 创建一个什么都不做直接通知错误的 Observable。
from( ) — 将一个 Iterable, 一个 Future, 或者一个数组转换成一个 Observable。
interval( ) — 创建一个按照给定的时间间隔发射整数序列的 Observable。
just( ) — 将一个或多个对象转换成发射这个或这些对象的一个 Observable。
range( ) — 创建一个发射指定范围的整数序列的 Observable。
repeat( ) — 创建一个重复发射指定数据或数据序列的 Observable。
repeatWhen( ) — 创建一个重复发射指定数据或数据序列的 Observable,它依赖于另一个 Observable 发射的数据。
never( ) — 创建一个不发射任何数据的 Observable。
timer( ) — 创建一个在给定的延时之后发射单个数据的 Observable。

1.1 create

使用一个函数从头创建一个 Observable。


rxjava_create
rxjava_create

示例代码:

 Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
        for (int i = 1; i < 5; i++) {
            emitter.onNext(i+"");
        }
        emitter.onComplete();
    }
}).subscribe(new Observer<String>() {
    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

    @Override
    public void onNext(@NonNull String s) {
        System.out.println("Next: " + s);
    }

    @Override
    public void onError(@NonNull Throwable error) {
        System.err.println("Error: " + error.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("Sequence complete.");
    }

输出:

Next: 1
Next: 2
Next: 3
Next: 4
Sequence complete.

其他

ObservableOnSubscribe, ObservableEmitter, Cancellable

1.2 defer

只有当订阅者订阅才创建 Observable;才会为每个订阅创建一个新的 Observable。


defer
defer

示例代码:

Observable<String> observable = Observable.defer(new Callable<ObservableSource<? extends String>>() {
        @Override
        public ObservableSource<? extends String> call() throws Exception {
            return Observable.just("String");
        }
    });
    observable.subscribe(new Consumer<String>() {
        @Override
        public void accept(@NonNull String s) throws Exception {
            System.out.println(s);
        }
    });

输出:

String

1.3 empty

创建一个什么都不做直接通知完成的 Observable。


empty
empty

示例代码:

 Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
        for (int i = 1; i < 5; i++) {
            emitter.onNext(i+"");
        }
        emitter.onComplete();
    }
}).subscribe(new Observer<String>() {
    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

    @Override
    public void onNext(@NonNull String s) {
        System.out.println("Next: " + s);
    }

    @Override
    public void onError(@NonNull Throwable error) {
        System.err.println("Error: " + error.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("Sequence complete.");
    }
});

输出结果:

onComplete

1.3 error

创建一个什么都不做直接通知错误的 Observable。


throw
throw

示例代码:

 Observable<String> observable = Observable.error(new Callable<Throwable>() {
    @Override
    public Throwable call() throws Exception {
        return new NullPointerException();
    }
});
observable.subscribe(new Observer<String>() {
    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

    @Override
    public void onNext(@NonNull String s) {
        System.out.println("Next: " + s);
    }

    @Override
    public void onError(@NonNull Throwable error) {
        System.err.println("Error: " + error.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("onComplete");
    }
});

输出结果:

Error: null

1.4 from()

将一个 Iterable, 一个 Future, 或者一个数组转换成一个 Observable。


from
from

示例代码1:

//1.遍历集合
List<String> items = new ArrayList<>();
for (int i = 0; i < 3; i++) {
    items.add(i + "");
}
Observable<String> observable = Observable.fromIterable(items);
//Observable<String> observable = Observable.fromArray(new String[]{"Hello", "world"});
observable.subscribe(new Consumer<String>() {
    @Override
    public void accept(@NonNull String s) throws Exception {
         System.out.println("result:" + s);
    }
});

输出结果:

result:0
result:1
result:2

1.5 interval()

创建一个按照给定的时间间隔发射整数序列的 Observable。


interval
interval

示例代码:

final CompositeDisposable disposable = new CompositeDisposable();
disposable.add(Observable.interval(1, TimeUnit.SECONDS).subscribeWith(new DisposableObserver<Long>() {
    @Override
    public void onNext(@NonNull Long aLong) {
        System.out.println("Next: " + aLong);
    }

    @Override
    public void onError(@NonNull Throwable error) {
        System.err.println("Error: " + error.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("onComplete");
    }
}));
//5秒后取消订阅
try {
    Thread.sleep(4000);
    //取消订阅
    disposable.dispose();
} catch (InterruptedException e) {
    e.printStackTrace();
}

输出结果:

Next: 0
Next: 1
Next: 2
Next: 3

1.6 just()

将一个或多个对象转换成发射这个或这些对象的一个 Observable。


just
just

示例代码:

Observable.just(1, 2, 3).subscribe(new Observer<Integer>() {
    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

    @Override
    public void onNext(@NonNull Integer s) {
        System.out.println("Next: " + s);
    }

    @Override
    public void onError(@NonNull Throwable error) {
        System.err.println("Error: " + error.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("onComplete");
    }
});

输出结果:

Next: 1
Next: 2
Next: 3
onComplete

1.7 range()

创建一个发射指定范围的整数序列的 Observable。
RxJava将这个操作符实现为 range 函数,它接受两个参数,一个是范围的起始值,一个是范围的数据的数目。如果你将第二个参数设为 0,将导致 Observable 不发射任何数据(如果设置为负数,会抛异常)


range
range

示例代码:

// 依次发射 10、11、12
Observable.range(10, 2).subscribe(new Observer<Integer>() {
    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

    @Override
    public void onNext(@NonNull Integer s) {
        System.out.println("Next: " + s);
    }

    @Override
    public void onError(@NonNull Throwable error) {
        System.err.println("Error: " + error.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("onComplete");
    }
});

输出结果:

Next: 10
Next: 11
Next: 12
onComplete

1.8 repeat()

创建一个重复发射指定数据或数据序列的 Observable。


repeat
repeat

示例代码:

//重复三次,repeat()就是无限次
Observable.just("hello", "world").repeat(3).subscribe(new Observer<Object>() {
    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

    @Override
    public void onNext(@NonNull Object o) {
        System.out.println("onNext:" + o.toString());
    }

    @Override
    public void onError(@NonNull Throwable error) {
        System.err.println("Error: " + error.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("onComplete");
    }
});

输出结果:

onNext:hello
onNext:world
onNext:hello
onNext:world
onNext:hello
onNext:world
onComplete

1.9 repeatWhen()

创建一个重复发射指定数据或数据序列的 Observable,它依赖于另一个 Observable 发射的数据。

1.10 never()

创建一个不发射任何数据的 Observable。


never
never

(ps:不太懂有何意义)

1.11 timer()

创建一个在给定的延时之后发射单个数据的 Observable。
在 RxJava 1.0.0 及其之后的版本,官方已不再提倡使用.timer() 操作符,因为.interval() 具有同样的功能。


timer
timer

示例代码:

Observable.timer(1, TimeUnit.SECONDS)
    .subscribe(new Consumer<Long>() {
        @Override
        public void accept(@NonNull Long aLong) throws Exception {
            System.out.println("result:" + aLong);
        }
    });

输出结果:

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

推荐阅读更多精彩内容