Observable基本用法(RxJava)

1.简介RxJava

一般我们进行耗时任务,如网络、数据库查询、复杂计算等等,我们都回开启一个线程,然后通过接口回调,获取我们的结果。 但随着我们业务逻辑的越来越复杂,我们就会陷入一个回调地狱,回调里面还有回调,在日后我们维护代码来说简直是噩梦。

RxJava的出现正式为了解决这个问题而生的,它支持链式调用!

关键字:异步链式调用观察者模式

这篇文章主要来记录Observable基本用法

2.create

final List<String> list = Arrays.asList(new String[]    
                                    {"one","two","three"});

Observable observable = Observable.create(new 
                        OnSubscribe<List<String>>() {
            @Override
            public void call(Subscriber<? super 
                                List<String>> subscriber) {
                subscriber.onNext(list);
                subscriber.onCompleted();
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

可以发现,我们发射的是以整个List<String> 我们可以发射一个一个对象吗?

当然可以:

        Observable observable = Observable.create(new 
            OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> 
            subscriber) {
                for (String str:list) {
                    subscriber.onNext(str);
                }
                subscriber.onCompleted();
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这样看起来好像还不是很优雅!有没有办法刚优雅呢? 那我们来看看from这个方法

3.from

Observable.from(list).subscribe(new Observer<String>() {

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

            @Override
            public void onError(Throwable arg0) {

            }

            @Override
            public void onNext(String string) {
                System.out.println(string);
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

结果是:

one
two
three
onCompleted
  • 1
  • 2
  • 3
  • 4
  • 5

符合我们的预期!

4.just

如果我只想发射list中的第二和第三位可以吗?

当然可以,我们可以借助just方法:

        Observable.just(list.get(1), list.get(2)).subscribe(new Observer<String>() {

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

            @Override
            public void onError(Throwable arg0) {

            }

            @Override
            public void onNext(String string) {
                System.out.println(string);
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

结果:

two
three
onCompleted
  • 1
  • 2
  • 3
  • 4

符合我们的预期!

备注:just方法可以接受1-10个参数

5.repeat

如果我们想将整个list重复发射两次或者三次呢?

Observable.from(list).repeat(2).subscribe(new 
        Observer<String>() {

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

            @Override
            public void onError(Throwable arg0) {

            }

            @Override
            public void onNext(String string) {
                System.out.println(string);
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

结果:

one
two
three
one
two
three
onCompleted
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

符合我们预期

备注:repeat可以不传参,效果是:无限循环

6.range

从X按顺序输出Y位数字?

Observable.range(88,10).subscribe(new Observer<Integer>() {

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

            @Override
            public void onError(Throwable arg0) {

            }

            @Override
            public void onNext(Integer arg0) {
                System.out.println(arg0+"");
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
88
89
90
91
92
93
94
95
96
97
onCompleted
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

7.interval(测试失败)

间隔时间发射:

        Observable.interval(3, TimeUnit.SECONDS).subscribe(new Subscriber<Long>() {

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

            @Override
            public void onError(Throwable arg0) {

            }

            @Override
            public void onNext(Long arg0) {
                System.out.println(arg0+"");
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

很奇怪,这个方法并没有起作用。

8.timer(测试失败)

延迟发射:

Observable.timer(1, TimeUnit.SECONDS).subscribe(new Observer<Long>() {

            @Override
            public void onCompleted() {
                // TODO Auto-generated method stub

            }

            @Override
            public void onError(Throwable arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onNext(Long arg0) {
                System.out.println(arg0+"");
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

这个方法和interval一样,也是不能测试。

它还有一个三个参数的方法timer(3,3,TimeUnit.SECONDS) 延迟3秒之后,每隔3秒发射一次

转载于:https://my.oschina.net/carbenson/blog/901785

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值