前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RxJava从入门到不离不弃(二)——简化代码

RxJava从入门到不离不弃(二)——简化代码

作者头像
蜻蜓队长
发布2018-08-03 10:25:41
3030
发布2018-08-03 10:25:41
举报
文章被收录于专栏:Android机动车Android机动车
上篇文章《RxJava从入门到不离不弃(一)——基本概念

上篇文章中的示例大家可能会觉得,打印字符串需要那么麻烦嘛?主要是为了展示RxJava的原理而采用了这种比较啰嗦的写法,RxJava其实提供了很多便捷的函数来帮助我们减少代码。今天一起来认识一下:

Observable简化

先看下Observable的原始写法:

代码语言:javascript
复制
Observable observer = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        subscriber.onNext("create1"); //发射一个"create1"的String
        subscriber.onNext("create2"); //发射一个"create2"的String
        subscriber.onCompleted();//发射完成,这种方法需要手动调用onCompleted,才会回调Observer的onCompleted方法
    }
});

Observable的创建使用Observable.create方法,传入OnSubscribe对象,OnSubscribe相当于一个“计划表”,call参数subscriber制定计划,onNext表示执行,onCompleted表示任务结束,onError表示出错。

再来看看如何简化Observable对象的创建过程。RxJava内置了很多简化创建Observable对象的函数,比如Observable.just就是用来创建只发出一个事件就结束的Observable对象,创建Observable对象可以这样写:

just

使用just( ),将为你创建一个Observable并自动为你调用onNext( )发射数据。

代码语言:javascript
复制
Observable observable = Observable.just(1, 2.3, 4, "js");
from

使用from( ),遍历集合,发送每个item。

注意:just()方法也可以传list,但是发送的是整个list对象,而from()发送的是list的一个item

代码语言:javascript
复制
List<String> list = new ArrayList<>();
list.add("from1");
list.add("from2");
list.add("from3");

Observable observable = Observable.from(list);
interval

使用interval( ),创建一个按固定时间间隔发射整数序列的Observable,可用作定时器。

第一个参数为 时间间隔大小 第二个参数为 时间间隔单位

代码语言:javascript
复制
Observable observable = Observable.interval(1, TimeUnit.SECONDS);
defer

使用defer( ),有观察者订阅时才创建Observable,并且为每个观察者创建一个新的Observable

代码语言:javascript
复制
//注意此处的call方法没有Subscriber参数
Observable deferObservable = Observable.defer(new Func0<Observable<String>>() {
    @Override
    public Observable<String> call() {
        return Observable.just("deferObservable");
    }
});
range

使用range( ),创建一个发射特定整数序列的Observable,第一个参数为起始值,第二个为发送的个数,如果为0则不发送,负数则抛异常。

代码语言:javascript
复制
Observable rangeObservable = Observable.range(1, 5);
timer

使用timer( ),创建一个Observable,它在一个给定的延迟后发射一个特殊的值。

等同于Android中Handler的postDelay( )方法。

代码语言:javascript
复制
Observable timeObservable = Observable.timer(3, TimeUnit.SECONDS);  //3秒后发射一个值
repeat

使用repeat( ),创建一个重复发射特定数据的Observable。

代码语言:javascript
复制
Observable repeatObservable =Observable.just("repeatObservable").repeat(3)

Subscriber简化

RxJava提供了Action0等一系列的类似的类,当我们不需要(或者不关心)Subscriber的全部方法(如只关心onNext方法),就可以使用Action类来替代Subscriber。

示例一

当我们并不关心OnComplete和OnError,我们只需要在onNext的时候做一些处理,这时候就可以使用Action1类:

代码语言:javascript
复制
Person person = new Person(21, "js");

Observable<Person> observable = Observable.just(person);

observable.subscribe(new Action1<Person>() {
    @Override
    public void call(Person person1) {
        Log.e("action1", "call: " + person1.toString());
    }
});
示例二

subscribe方法还有两个重载方法,分别是:

  • 两个参数: subscribe(onNextAction , onErrorAction)
  • 三个参数: subscribe(onNextAction , onErrorAction ,onCompletedAction)
代码语言:javascript
复制
Action1<Person> onNextAction = new Action1<Person>() {
    @Override
    public void call(Person o) {
        Log.e("method2", "call: " + o.toString());
    }
};

Action1<Throwable> onErrorAction = new Action1<Throwable>() {
    @Override
    public void call(Throwable o) {
        Log.e("method2", "call: " + o.toString());
    }
};

Action0 onCompletedAction = new Action0() {
    @Override
    public void call() {
        Log.e("method2", "call: ");
    }
};

observable.subscribe(onNextAction, onErrorAction);
// 或者重载方法
observable.subscribe(onNextAction, onErrorAction, onCompletedAction);

Action0 是 RxJava 的一个接口,它只有一个方法 call(),这个方法是无参无返回值的;由于 onCompleted() 方法也是无参无返回值的,因此 Action0 可以被当成一个包装对象,将 onCompleted() 的内容打包起来将自己作为一个参数传入 subscribe() 以实现不完整定义的回调。这样其实也可以看做将onCompleted() 方法作为参数传进了 subscribe(),相当于其他某些语言中的『闭包』。Action1 也是一个接口,它同样只有一个方法 call(T param),这个方法也无返回值,但有一个参数;与 Action0 同理,由于 onNext(T obj) 和 onError(Throwable error)也是单参数无返回值的,因此 Action1 可以将 onNext(obj) 和 onError(error) 打包起来传入 subscribe() 以实现不完整定义的回调。事实上,虽然 Action0 和 Action1 在 API 中使用最广泛,但 RxJava 是提供了多个 ActionX 形式的接口 (例如 Action2, Action3) 的,它们可以被用以包装不同的无返回值的方法。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android机动车 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Observable简化
    • just
      • from
        • interval
          • defer
            • range
              • timer
                • repeat
                • Subscriber简化
                  • 示例一
                    • 示例二
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档