初识RxJava(二)延时类 操作符

前言:

笔者写这些东西,只是笔者的学习积累,也就是笔记吧。希望可以帮助各位看客,接收各种批评建议。下面进入 延时 类操作符

正文:

1、defer 操作符

1)、作用

当有观察者 进行了注册之后 才进行发送事件;
每次创建的 被观察者 均不相同 即为最新创建的被观察者对象

2)、代码
    private int i = 0;

    /**
     * defer() 操作符
     */
    private void deferMethod(final int i) {


        final Observable observable = Observable.defer(new Callable>() {
            @Override
            public ObservableSource call() throws Exception {
                //打印 是否发送数据
                logDUtils("ObservableSource:" + i);
                return Observable.just(i);
            }
        });

        //每次 打印 被观察者的 hashCode 虽然 hashCode 不能标定 是否对象相同, 但是是一个间接的因素,测试可以直接打印 被观察者对象即可
        //打印hashCode 只为了 日志好看。。。
        logDUtils(observable.hashCode() + "");

        // 当 i >= 3 创建观察者 
        if (i >= 3) {
            observable.subscribe(new Observer() {
                @Override
                public void onSubscribe(Disposable d) {
                    logDUtils("onSubscribe:");
                }

                @Override
                public void onNext(Integer integer) {
                    logDUtils("onNext:" + integer);
                }

                @Override
                public void onError(Throwable e) {
                    logDUtils("onError:" + e.getMessage());
                }

                @Override
                public void onComplete() {
                    logDUtils("onComplete:");
                }
            });
        }

        if (i == 5) {
            logDUtils("---------------------------------------------------");
        }
    }

    //每次点击按钮 i 自加
    public void doClick(View v) {
        i++;
        logDUtils("传入i: " + i);
        deferMethod(i);
    }
3)、效果演示

初识RxJava(二)延时类 操作符_第1张图片

每次点击 按钮 i 自加 ,都会创建一个 observable 对象,但是不会发送数据,直到 产生了订阅关系 ,才会发送数据,并且处理数据。而且每次 处理完成就结束该事件。

2、timer 操作符

1)、作用

创建1个被观察者对象
延迟指定时间后 发送数据 、接收处理 。默认情况下只发送一次。

2)、代码
  /**
     * timer 操作符
     */
    private void timerMethod() {
        final long[] a = {0};
        final long[] b = {0};
        Observable.timer(10, TimeUnit.SECONDS)
                .subscribe(new Observer() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        a[0] = System.currentTimeMillis();
                        logDUtils("onSubscribe");
                    }

                    @Override
                    public void onNext(Long aLong) {
                        logDUtils("onSubscribe" + aLong);
                    }

                    @Override
                    public void onError(Throwable e) {
                        logDUtils("onError" + e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        b[0] = System.currentTimeMillis();
                        logDUtils("程序执行时间: " + (b[0] - a[0]) + " 毫秒");
                        logDUtils("onComplete");
                    }
                });
    }
3)、运行效果

初识RxJava(二)延时类 操作符_第2张图片

timer 默认是 运行在 自己的线程的,可以查看一下源码啥的;

但是 timer 有两个独立的方法
分别是:

public static Observable timer(long delay, TimeUnit unit)
public static Observable timer(long delay, TimeUnit unit, Scheduler scheduler)

第二个方法可以 程序员自己进行定义相关的 调度器。

3、interval 操作符

1)、作用

创建1个被观察者对象
每隔指定时间就发送事件 (定时器)

2)、代码
   /**
     * interval 操作符
     */
    private void intervalMethod() {
        Observable.interval(5, TimeUnit.SECONDS).subscribe(new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                logDUtils("onSubscribe:");
            }

            @Override
            public void onNext(Long aLong) {
                logDUtils("onNext:" + aLong);
            }

            @Override
            public void onError(Throwable e) {
                logDUtils("onError:" + e.getMessage());
            }

            @Override
            public void onComplete() {
                logDUtils("onComplete");
            }
        });
    }
3)、效果

初识RxJava(二)延时类 操作符_第3张图片

该操作符有以下几个方法

//参数:时间间隔   单位
 public static Observable interval(long period, TimeUnit unit)
//参数:时间间隔  单位  自定义调度器
 public static Observable interval(long period, TimeUnit unit, Scheduler scheduler)

//参数:初始延迟时间  时间间隔  单位
 public static Observable interval(long initialDelay, long period, TimeUnit unit)
//参数:初始延迟时间  时间间隔  单位  自定义调度器
 public static Observable interval(long initialDelay, long period, TimeUnit unit, Scheduler scheduler) 

4、intervalRange 操作符

1)、作用

创建1个被观察者对象
每隔指定时间 发送 事件,可以指定发送的数据的数量
类似于 interval 操作符 但是可以指定 发射的 数据数量以及开始的事件

2)、代码
  /**
     * intervalRange 操作符
     */
    private void intervalRangeMethod() {
        Observable.intervalRange(9, 2, 5, 5, TimeUnit.SECONDS)
                .subscribe(new Observer() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        logDUtils("onSubscribe:");
                    }

                    @Override
                    public void onNext(Long aLong) {
                        logDUtils("onNext:" + aLong);
                    }

                    @Override
                    public void onError(Throwable e) {
                        logDUtils("onError:" + e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        logDUtils("onComplete");
                    }
                });
    }
3)、效果

初识RxJava(二)延时类 操作符_第4张图片

该操作符有两个方法

//参数:开始事件是哪个   发送事件个数   开始发送时间延迟   事件之间的时间间隔   单位
 public static Observable intervalRange(long start, long count, long initialDelay, long period, TimeUnit unit)
//参数:开始事件是哪个   发送事件个数   开始发送时间延迟   事件之间的时间间隔   单位  自定义调度器
 public static Observable intervalRange(long start, long count, long initialDelay, long period, TimeUnit unit, Scheduler scheduler)

5、range 操作符

1)、作用

创建1个被观察者对象(
连续发射 指定范围内的 事件序列 可以指定开始 事件位置

2)、代码
/**
     * range 操作符
     */
    private void rangeMethod() {
        Observable.range(4, 3).subscribe(new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                logDUtils("onSubscribe:");
            }

            @Override
            public void onNext(Integer integer) {
                logDUtils("onNext:" + integer);
            }

            @Override
            public void onError(Throwable e) {
                logDUtils("onError:" + e.getMessage());
            }

            @Override
            public void onComplete() {
                logDUtils("onComplete");
            }
        });
    }
3)、效果

初识RxJava(二)延时类 操作符_第5张图片

参数:从4事件开始 发射3个事件

6、rangeLong 操作符

作用

类似于 range 操作符,只是该操作符 支持了 long 类型数据

欢迎关注

你可能感兴趣的:(RxJava,使用)