天天看点

RxJava 操作符之创建类操作符

RxJava有很多操作符,我们从创建类操作符说起:

1、rang操作符:第一个参数范围,第二个参数数量。表示事件源发送五个不小于10的数据

这个操作符接收两个参数

//发射5个不小于10的数据
        Observable.range(10, 5).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                Log.d("Tag", integer + "");
                Toast.makeText(MainActivity.this, integer + "", Toast.LENGTH_SHORT).show();
            }
        });
           

2、just操作符:这个操作符之前用过,直接将发送数据发送出去:如果他要发送的数据是数组的话,会将数组作为一个整体一起发送出去。

String[] words = {"Hello", "Rx", "Java"};
        Observable.just(words).subscribe(new Action1<String[]>() {
            @Override
            public void call(String[] s) {
                Toast.makeText(MainActivity.this,s.length+"", Toast.LENGTH_SHORT).show();
            }
        });
           

3、from操作符,如果发送的数据为单个字符串,单个数字什么的,效果跟just一样,如果发送的是数组、list什么什么的,区别在于他会将数组中的数据一个一个发送出去

String[] words = {"Hello", "Rx", "Java"};
        Observable.from(words).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        });
           

4、defer操作符,defer,指延时,它创建的事件流不会立即产生,只有在发生订阅关系的时候,才会产生Observable,以保证发送的数据是最新的。

final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Observable justObservable = Observable.just(df.format(new Date()));//这个时候就为Date赋值
        Observable deferObservalbe = Observable.defer(new Func0<Observable<String>>(){
            @Override
            public Observable<String> call() {
                return Observable.just(df.format(new Date()));//在订阅那一刻返回一个最新的Observable。
            }
        });
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        justObservable.subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                textView.setText(s);
               //Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        });
        //订阅这一刻,defer会返回一个最新的Observable,以确保数据是最新的。
        deferObservalbe.subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        });
           

我们分别通过just和defer创建了两个事件流。just传进去一个时间,defer比较奇怪。传了个Func0对象,这个东西跟前面说到的Aciton很像,也是RxJava的一个接口,用来包装一个方法,传给另一个方法,实现闭包操作,Func包装的方法是有返回值的,而Action包装的方法没有返回值。上面我们用的是Func0<Observable<String>>,表示包装的方法没有参数的,而且该方法会返回一个Observable<Stirng>对象。如果,你看到了Func2<String,Interger,Interger>的接口,表示他会包装一个方法,该方法需要两个Interger类型的参数,并且返回一个String类型的结果。Ok,希望哥们没被我说晕。继续我们上面的代码。上面Func0包装的方法返回的Observable我们是通过just方法创造出来的,这个Observable会发送一个时间。然后我们让程序睡眠2秒钟。别太长,会ANR。接着分别取订阅,JustObservable事件流发送的时间放到textView中显示,deferObservable事件流发送的的时间用一个用Toast显示,然后通过观察发现deferObservable发送的时间更新,(晚两秒钟)

RxJava 操作符之创建类操作符

5、timer操作符,延时发送数据。接收两个参数,一个时间,一个时间单位。timer创建出来的事件流默认在computation 线程中执行,所有我们观察的时候要切换到主线程。这个线程的调度器上次提到了哈。

//延时发送操作,五秒后发射,默认运行在computation Scheduler
     Observable.timer(5, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<Long>() {
         @Override
         public void call(Long aLong) {
             Toast.makeText(MainActivity.this, "这是五秒后接受到的", Toast.LENGTH_SHORT).show();
         }
     });
           

6、Rxjava的轮询器,间隔发送整数序列(并且可以指定延时),比timer多了轮询。默认运行在computation Scheduler,下面的例子为三秒后发送数据,每隔五秒发送一次,当然你也可以指定两个参数,就是不延时直接轮询发送。

Observable.interval(3, 5, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        Toast.makeText(MainActivity.this, aLong+"", Toast.LENGTH_SHORT).show();
                    }
                });
           

它会一直发送数据,一直发送,直到订阅者主动调用unsubscribe()取消订阅为止。

----------------------------------------------------------刘诗诗的事业线------------------------------------------------------

到上面创建类的操作符应该涵盖的差不多了,不知道有没有漏掉哪个。下面要说的两个操作符虽然不是创建类的操作符,但是功能给创建类的操作符挺像,在这加上,以作比较。

7、delay操作符,延迟一段时间,再发送来自事件流发送的结果,功能虽然跟timer类似,但是级别更低,用于事件流过程中的操作,可以延迟发送事件流中的某一次发送。

Observable.just("延时五秒钟发送我").delay(5,TimeUnit.SECONDS).subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        });
           

8、Repeat操作符,重复发送,默认运行在新线程。

//重复发送五次,默认运行在新线程
        Observable.just("我会出现5次").delay(3, TimeUnit.SECONDS).repeat(5)
                .observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        });
           

这个例子可以看到,操作符可以累加操作,而且是个线性的过程。创建类的操作符先记录到这里,下次玩下变换类的操作符。

代码地址:

https://github.com/dagaozi/RxjavaDemo