设为首页 加入收藏

TOP

Android开发学习之路-Android中使用RxJava(二)
2017-10-13 10:35:51 】 浏览:2419
Tags:Android 开发 习之 -Android 使用 RxJava
g s) { Log.d(TAG,
"call() called with: s = [" + s + "]"); } });

 如果我们只关心onNext和onError,则可以用两个Action1来表示,因为subscribe的重载允许我们这么做,可以自行尝试。


 

因为RxJava的内容其实比较多,这里就对其中一些进行介绍,有兴趣的可以转到文章最后的地方会给出一些参考文章。

① 创建操作

常见的创建操作有几种:Create、From、Just和Interval(还有其他可以参考文末文章)

上面的例子中直接使用了create方法进行Observable的创建,下面可以通过just来进行简单的创建,代码如下:

1         Observable.just("hello", "world").subscribe(new Action1<String>() {
2             @Override
3             public void call(String s) {
4                 Log.d(TAG, "call() called with: s = [" + s + "]");
5             }
6         });

和例子中的效果是一样的,但是这里要注意了,just方法可以传入任何类型的对象,但是必须和Action1或者Subscriber所指定的泛型一致。

也就是假设我们要打印的不是字符串而是数字,代码变成如下所示:

1         Observable.just(1, 2).subscribe(new Action1<Integer>() {
2             @Override
3             public void call(Integer s) {
4                 Log.d(TAG, "call() called with: s = [" + s + "]");
5             }
6         });

Action1所指定的泛型由String改为Integer,call方法的参数也相应的更改。

from方法也可以创建Observable,用法可以自行尝试。

这里说一下Interval方法,Android开发中可能会用到。Interval是定时器,每隔一段时间发送一个消息,这个消息由一个Long类型的值表示,从0开始。代码:

1         Observable.interval(1, TimeUnit.SECONDS).subscribe(new Action1<Long>() {
2             @Override
3             public void call(Long aLong) {
4                 Log.d(TAG, "call() called with: s = [" + aLong + "]");
5             }
6         });

运行代码之后,Logcat会每隔一秒打印一句Log,而aLong的值会从0开始每次递增1。interval方法的参数分别是:间隔值、间隔单位,上面代码指的是每隔1s触发一次。

光有计时器还不行,我们怎么让它自动停止呢,比如说打印5次。这里涉及到RxJava的过滤问题,就是使用take方法并传入发送次数,当发送次数大于这个值的时候,其他的消息都被过滤了,我们的Subscriber不再接收。代码如下:

1         Observable.interval(1, TimeUnit.SECONDS).take(5).subscribe(new Action1<Long>() {
2             @Override
3             public void call(Long aLong) {
4                 Log.d(TAG, "call() called with: s = [" + aLong + "]");
5             }
6         });

这里的take方法不能在subscribe方法后调用,因为subscribe方法返回值不再是Observable

当然,take方法还有其他重载,可以自行尝试。

 

② 变换操作

变换操作主要是对Observable发送的消息进行变换,使得在Subscriber中处理起来更加简单。就通过上面的例子来说明吧,我们设定了的计时器中,每次返回给Subscriber(Action1)的值是Long类型的,假设我们要在接收端得到一个Integer类型的值,怎么办呢?就要使用变换,最常用的变换就是map。

 1         Observable.interval(1, TimeUnit.SECONDS).take(5).map(new Func1<Long, Integer>() {
 2             @Override
 3             public Integer call(Long aLong) {
 4                 return aLong.intValue();
 5             }
 6         }).subscribe(new Action1<Integer>() {
 7             @Override
 8             public void call(Integer integer) {
 9                 Log.d(TAG, "call() called with: s = [" + integer + "]");
10             }
11         });

可以看到这个时候Action1使用的泛型变为Integer而不是Long,因为我们在subscribe方法之前调用了map方法对消息进行变换,可以看到,变换需要传入一个Funcx的对象,并实现一个call方法将Long类型的数据转换为Integer类型。希望你还记得Func1表示含有一个参数和一个返回值。

接着再说一个比较常用的,名字是flatmap。它的作用,是把一个数据类型变成一个Observable对象。也就是说Observable里面包含Observable,而新建出来的Observable中的消息会交付给原来的Observable进行发送。如果不明白,可以看例子:

假设有两个类,一个是学生(姓名、选课),一个是课程(分数),学生类中的选课是数组类型,要求是打印所有学生的每个选课成绩

    private class Student{
        String name;
        Course[] courses;
        Student(String name, Course[] courses) {
            this.name = name;
            this.courses = courses;
        }
    }

    private class Course{
        int score;
        private Course(int score) {this.score = score;}
    }

如果我们上面的做法,代码如下:

 1         Student s1 = new Student("Jack", new Course[]{new Course(80), new Course(79)});
 2         Student s2 = new Student("Rose", new Course[]{new Course(87), new Course(69)});
 3 
 4         Observable.just(s1, s2).subscribe(new Action1<Student>() {
 5             @Ove
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇实用控件分享:自定义逼真相机光.. 下一篇Android版本控制系统及其间的差异

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目