初识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 类型数据

相关文章
|
6月前
|
人工智能
AI 原生应用开发实战营 | 用户洞察集锦
AI 原生应用开发实战营 | 用户洞察集锦
335 0
【SPSS】因子分析详细操作教程(附案例实战)
【SPSS】因子分析详细操作教程(附案例实战)
2980 0
|
SQL 监控 关系型数据库
MySQL中,如何定位慢查询?
MySQL中,如何定位慢查询?
586 0
|
3天前
|
云安全 人工智能 运维
阿里云SecOps Agent,全新安全跨产品执行体验
自然语言驱动 云安全中心/WAF/CFW/ 等多款安全产品联动
1593 2
|
3天前
|
机器学习/深度学习 人工智能 调度
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
HappyHorse 1.1 是新一代视频生成大模型,全面升级动态表现力、角色一致性、指令遵循、视觉质感与音画协同能力。支持I2V/T2V/R2V三类生成,适配短剧、电商广告、品牌营销等场景,提供高质、流畅、可控的AI视频生产力。
561 3
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
|
14天前
|
缓存 测试技术 API
Qwen 3.7 Plus 与 Max 实测:性价比与多模态能力差异解析(2026)
2026 年 6 月 1 日,阿里悄无声息地发布了 Qwen 3.7 Plus,距 Qwen 3.7 Max 上线刚好 11 天。同样的 1M 上下文,同样的 35 小时自治上限。但价格才是头条:Plus 是 0.40/M输入,Max是 2.50/M——便宜约 6 倍——并且还能看图、看视频。Vision Arena 上 Plus 已经排到 #16。所以这周真正值得讨论的问题不是”要不要为视觉能力买单”,而是”Max 凭什么用 6 倍价格换来 2 个百分点的 benchmark 领先”。
|
15天前
|
JavaScript 定位技术 API
CodeGraph 爆火:编程 Agent 需要的不是更多上下文,而是一张提前画好的代码地图
CodeGraph 是一款爆火的本地代码智能工具,通过 tree-sitter 解析 AST 构建结构化知识图谱(存于 SQLite),为编程 Agent 提前生成“代码地图”。它显著降低 Agent 在中大型项目中的探索成本——实测工具调用减少71%、Token 降57%、速度提升46%,支持19+语言及主流框架路由识别,完全离线、无需 API Key。
909 11
CodeGraph 爆火:编程 Agent 需要的不是更多上下文,而是一张提前画好的代码地图
|
2天前
|
人工智能 监控 前端开发
Electron 监控:让桌面 Agent 监控触手可及
一行代码实现Electron桌面端全景监控,自动还原崩溃现场、预警内存泄漏、全链路追踪、 SSE流式响应与交互埋点,让 AI 助手运行状态清晰可见,助力快速恢复稳定与流畅。
178 125
|
2天前
|
消息中间件 人工智能 Kafka
AI 时代,实时入湖正在告别 ETL:从 Kafka 到 Iceberg 的架构减法
本文围绕“零 ETL”这一趋势,讨论流数据入湖为什么需要做架构减法,并结合 Kafka × Table Bucket 的实践,分析一种将通用入湖能力前移到消息与表存储链路中的方案,如何在降低复杂度的同时,兼顾实时性、一致性、Schema 演进、CDC 语义与开放生态兼容。
185 122