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

简介:

前言:

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

正文:

1、defer 操作符

1)、作用

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

2)、代码
    private int i = 0;

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


        final Observable<Integer> observable = Observable.defer(new Callable<ObservableSource<? extends Integer>>() {
            @Override
            public ObservableSource<? extends Integer> 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<Integer>() {
                @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)、效果演示

运行效果

每次点击 按钮 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<Long>() {
                    @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)、运行效果

运行效果

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

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

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

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

3、interval 操作符

1)、作用

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

2)、代码
   /**
     * interval 操作符
     */
    private void intervalMethod() {
        Observable.interval(5, TimeUnit.SECONDS).subscribe(new Observer<Long>() {
            @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)、效果

interval 效果

该操作符有以下几个方法

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

//参数:初始延迟时间  时间间隔  单位
 public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit)
//参数:初始延迟时间  时间间隔  单位  自定义调度器
 public static Observable<Long> 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<Long>() {
                    @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)、效果

intervalRange 效果

该操作符有两个方法

//参数:开始事件是哪个   发送事件个数   开始发送时间延迟   事件之间的时间间隔   单位
 public static Observable<Long> intervalRange(long start, long count, long initialDelay, long period, TimeUnit unit)
//参数:开始事件是哪个   发送事件个数   开始发送时间延迟   事件之间的时间间隔   单位  自定义调度器
 public static Observable<Long> 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<Integer>() {
            @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)、效果

效果

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

6、rangeLong 操作符

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

相关文章
RxJava2源码分析(二):操作符原理分析
RxJava2源码分析(二):操作符原理分析
RxJava2源码分析(二):操作符原理分析
|
Java Kotlin
Kotlin 中初始化块、初始化的顺序、lateinit延迟初始化详解
Kotlin 中初始化块、初始化的顺序、lateinit延迟初始化详解
105 0
|
安全 开发者
容易被忽略的知识点:RxJava操作符的线程安全
RxJava操作符大多不是线程安全的,如果所以写代码时不注意这一点很容易发生bug。本文将分享如何写成更安全的Rxjava代码
251 0
容易被忽略的知识点:RxJava操作符的线程安全
|
Kotlin
【Kotlin】扩展函数 ( 扩展函数声明 | 调用方式 | 与成员函数优先级 | 接收者空值处理 )
【Kotlin】扩展函数 ( 扩展函数声明 | 调用方式 | 与成员函数优先级 | 接收者空值处理 )
143 0