RxJava - timer/interval/range/intervalRange示例和详细解析

3,526 阅读4分钟

timer

示例1
Observable.timer(5, TimeUnit.SECONDS)
          .subscribe(myObserver());

private Observer<? super Long> myObserver() {
    return new Observer<Long>() {
        @Override
        public void onSubscribe(Disposable d) {
            System.out.println("onSubscribe");
        }

        @Override
        public void onNext(Long aLong) {
            System.out.println("接收----->" + aLong);
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {
            System.out.println("onComplete");
        }
    };
}
08-26 15:37:06.813 12178-12178/com.zwb.rxjavademo I/System.out: onSubscribe
08-26 15:37:11.817 12178-12208/com.zwb.rxjavademo I/System.out: 接收----->0
08-26 15:37:11.817 12178-12208/com.zwb.rxjavademo I/System.out: onComplete
分析

返回一个Observable,它在延迟一段给定的时间(5s)后发射一个简单的数字0。

操作符默认在computation调度器上执行。有一个变体可以通过可选参数指定Scheduler。

比如指定在newThread线程: Observable.timer(5, TimeUnit.SECONDS, Schedulers.newThread())

interval

Interval操作符返回一个Observable,它按固定的时间间隔(2s)发射一个无限递增的整数序列。

interval默认在computation调度器上执行。你也可以传递一个可选的Scheduler参数来指定调度器。

示例
//延迟 5s,间隔 2s,发送无限增长的 Long 型数列
Observable.interval(5,2,TimeUnit.SECONDS)
          .subscribe(myObserver());
08-26 16:29:45.407 13381-13381/com.zwb.rxjavademo I/System.out: onSubscribe
//延时了5s执行,间隔是2s
08-26 16:29:50.410 13381-13410/com.zwb.rxjavademo I/System.out: 接收----->0
08-26 16:29:52.411 13381-13410/com.zwb.rxjavademo I/System.out: 接收----->1
08-26 16:29:54.411 13381-13410/com.zwb.rxjavademo I/System.out: 接收----->2
08-26 16:29:56.410 13381-13410/com.zwb.rxjavademo I/System.out: 接收----->3
08-26 16:29:58.410 13381-13410/com.zwb.rxjavademo I/System.out: 接收----->4
08-26 16:30:00.411 13381-13410/com.zwb.rxjavademo I/System.out: 接收----->5
......
分析

interval有四个重载方法:

// 延时和间隔都是 period
public static Observable<Long> interval(long period, TimeUnit unit)
// 延时initialDelay,间隔 period
public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit)
// 延时和间隔都是 period,指定Scheduler
public static Observable<Long> interval(long period, TimeUnit unit, Scheduler scheduler)
// 延时initialDelay,间隔 period,指定Scheduler
public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit, Scheduler scheduler)

range 和 rangeLong

Range操作符发射一个范围内的有序整数序列,你可以指定范围的起始和长度。

RxJava将这个操作符实现为range函数,它接受两个参数,一个是范围的起始值,一个是范围的数据的数目。如果你将第二个参数设为0,将导致Observable不发射任何数据(如果设置为负数,会抛异常)。

range默认不在任何特定的调度器上执行。有一个变体可以通过可选参数指定Scheduler。

示例
// 从 2 开始发送 5 个数据,区间为 [2,7)
Observable.rangeLong(2,5)
          .subscribe(myObserver());
08-26 17:14:04.780 14035-14035/com.zwb.rxjavademo I/System.out: onSubscribe
08-26 17:14:04.780 14035-14035/com.zwb.rxjavademo I/System.out: 接收----->2
08-26 17:14:04.780 14035-14035/com.zwb.rxjavademo I/System.out: 接收----->3
08-26 17:14:04.780 14035-14035/com.zwb.rxjavademo I/System.out: 接收----->4
08-26 17:14:04.780 14035-14035/com.zwb.rxjavademo I/System.out: 接收----->5
08-26 17:14:04.780 14035-14035/com.zwb.rxjavademo I/System.out: 接收----->6
08-26 17:14:04.780 14035-14035/com.zwb.rxjavademo I/System.out: onComplete
分析

intervalRange

intervalRange 可以指定发送事件的开始值和数量,用法和interval相同

示例
// 延迟 2s, 间隔 1s,从 2 开始发送 5 个数据
Observable.intervalRange(2,5,2,1,TimeUnit.SECONDS)
                .subscribe(myObserver());
08-26 17:22:46.587 14314-14314/com.zwb.rxjavademo I/System.out: onSubscribe
//延时了2s执行,间隔是1s
08-26 17:22:48.589 14314-14348/com.zwb.rxjavademo I/System.out: 接收----->2
08-26 17:22:49.589 14314-14348/com.zwb.rxjavademo I/System.out: 接收----->3
08-26 17:22:50.589 14314-14348/com.zwb.rxjavademo I/System.out: 接收----->4
08-26 17:22:51.589 14314-14348/com.zwb.rxjavademo I/System.out: 接收----->5
08-26 17:22:52.588 14314-14348/com.zwb.rxjavademo I/System.out: 接收----->6
08-26 17:22:52.588 14314-14348/com.zwb.rxjavademo I/System.out: onComplete
分析



欢迎转载,但是请注明出处

示例源码
个人Github主页

如果对您有帮助,您可以 "Star" 支持一下哦, 谢谢! ^^