RxJava 操作符之创建类操作符

来源:互联网 发布:java double两位小数 编辑:程序博客网 时间:2024/06/05 16:35

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发送的时间更新,(晚两秒钟)



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





0 0
原创粉丝点击