首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

上篇文章《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) 的,它们可以被用以包装不同的无返回值的方法。

下一篇
举报
领券