RxJava—创建操作符

1.前言

       在前面的一篇文章中介绍了RxJava的一些基本概念和RxJava的最简单用法,如果对这两个不是很清楚的话建议去看看RxJava—入门介绍。从本章开始会开始聊聊RxJava中的操作符(Operators),RxJava之所以强大是因为它提供了丰富且功能强大的操作符,通过使用和组合这些操作符几乎可以完成所有想要完成的任务,RxJava的操作符主要分为:创建操作符、转换操作符、过滤操作符、组合操作符、错误处理操作符、功能性操作符、条件操作符、数学运算及聚合操作符、其它操作符等。

       在本章的内容中主要介绍创建操作符,常见的创建操作符有:create()、just()、from()、defer()、interval()、timer()、range()、repeat()。

2.创建操作符的使用

(1)Create()

       create()操作符是所有创建型操作符的“根”,也就是说其他创建型操作符最后都是通过create操作符来创建Observable的,它的作用是从头开始创建一个Observable对象,默认不在任何调度器上运行。

       根据官方给出的原理图:

       

       现在要使用create()创建一个Observable对象

Observable.create(new Observable.OnSubscribe<Integer>()
{
    public void call(Subscriber<? super Integer> subscriber)
    {
        try
        {
            if(!subscriber.isUnsubscribed())
            {
                for(int i = 0; i < 5; i++)
                {
                    subscriber.onNext(i);
                }
                subscriber.onCompleted();
            }
        }
        catch (Exception e)
        {
            subscriber.onError(e);
        }
    }})
        .subscribe(new Subscriber<Integer>()
        {
            public void onCompleted()
            {
                Log.d("Create", "onCompleted()");
            }

            public void onError(Throwable e)
            {
                e.printStackTrace();
                Log.d("Create", "onError()");
            }

            public void onNext(Integer integer)
            {
                Log.d("Create", "onNext:" + integer);
            }
        });

       当点击按钮后在控制台上,可以看到这样的结果:

       

(2)From

       from()操作符是把其他类型的对象和数据类型转化成Observable,在RxJava中,from()操作符可以转换Future、Iterator和数组,产生的Observable会发射Iterator或数组的每一项数据。from()默认不在任何特定的调度器上执行。然而你可以将Scheduler作为可选的第二个参数传递给Observable,它会在那个调度器上管理这个Future。

       根据官方给出的原理图:

       

       现在要使用create()创建一个Observable对象
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
Observable.from(list)
        .subscribe(new Action1<String>()
        {
            public void call(String s)
            {
                Log.d("From", s);
            }
        });
       当点击按钮后在控制台上,可以看到这样的结果:A B C D E
(3)Just
       just()操作符也是把其他类型的对象和数据类型转化成Observable,只是简单的将数据原样发射,原来是什么类型就发射什么类型,顺序就是按照参数列表的顺序进行发射,它和from操作符很像,只是方法的参数有所差别。

       根据官方给出的原理图:

       

       现在要使用just()创建一个Observable对象
Observable.just("A", "B", "C", "D", "E")
        .subscribe(new Action1<String>()
        {
            public void call(String s)
            {
                Log.d("Just", s);    
            }
        });
       当点击按钮后在控制台上,可以看到这样的结果:A B C D E
(4)Defer()
       defer操作符是直到有订阅者订阅时,才通过Observable的工厂方法创建Observable并执行,defer操作符能够保证Observable的状态是最新的。

       根据官方给出的原理图:

   

       defer()与just()不同点在于,just()是在创建Observable就进行了赋值操作,而defer()是在订阅者订阅时才创建Observable,此时才进行真正的赋值操作
(5)Interval()
       interval操作符返回一个Observable,它按固定的时间间隔发射一个无限递增的长整型的整数序列,此操作符接收两个参数,第一个参数表示间隔的时间,第二个参数表示间隔的时间单位。

       根据官方给出的原理图:

   

       现在要使用interval()创建一个Observable对象
Observable.interval(1, TimeUnit.SECONDS)
        .subscribe(new Action1<Long>()
        {
            public void call(Long aLong)
            {
                Log.d("interval", aLong.toString());
            }
        });
       以上代码是以秒为单位,每过1秒发射一个数据
(6)Range
       range()操作符创建一个发射指定范围的整数序列的Observable,你可以指定范围的起始和长度,此操作符接收两个参数,第一个参数表示范围的起始值,第二个参数表示数据的数目,如果将第二个参数设置为0将导致Observable不发射任何数据,如果将第二个参数设置为负数将导致Observable抛异常。

       根据官方给出的原理图:

       

       现在要使用 range()创建一个Observable对象
Observable.range(0, 10)
        .subscribe(new Action1<Integer>()
        {
            public void call(Integer integer)
            {
                Log.d("range", integer.toString());
            }
        });
       当点击按钮后在控制台上,可以看到这样的结果:0 1 2 3 4 5 6 7 8 9
(7)Repeat
       repeat()操作符用于设置成为重复地发射数据,某些实现允许你重复的发射某个数据序列,还有一些允许你限制重复的次数。要注意的是这个操作符并不能创建一个 Observable,而是将一个已经创建好的Observable设置成为重复发射的Observable数据序列,通过参数指定要重复的次数,如果不指定参数则是设置为无限发射。

       根据官方给出的原理图:

       

       现在要使用 range()设置一个重复发射的Observable对象
Observable.just("1", "2", "3")
        .repeat(2)
        .subscribe(new Action1<String>()
        {
            public void call(String s)
            {
                Log.d("repeat", s);
            }
        });
       当点击按钮后在控制台上,可以看到这样的结果:1 2 3 1 2 3
(8)Timer
       timer()操作符创建一个在给定的时间段之后返回一个特殊的Observable ,这个特殊的Observable将在延迟一段时间后发射一个简单的数字0。

       根据官方给出的原理图:

       

       现在要使用 timer()创建一个延迟发射的Observable对象
final SimpleDateFormat sdf = new SimpleDateFormat("HH:MM:SS");
final String beginTime = sdf.format(new Date());
Log.d("timer", "beginTime: " + beginTime);
Observable.timer(2, TimeUnit.SECONDS)
        .subscribe(new Action1<Long>()
        {
            public void call(Long aLong)
            {
                Log.d("timer", aLong.toString());
                String endTime =  sdf.format(new Date());
                Log.d("timer", "endTime: " + endTime);
            }
        });
       当点击按钮后在控制台上,可以看到这样的结果:
       







       以上Demo的源代码地址:点击打开链接





















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值