RxJava—创建操作符

来源:互联网 发布:云计算大数据视频教程 编辑:程序博客网 时间:2024/05/16 06:39

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