温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

rxjava怎么实现轮询

发布时间:2026-09-20 17:25:25 来源:亿速云 阅读:94 作者:小樊 栏目:编程语言

在 RxJava 中实现“轮询”(每隔一段时间请求一次接口 / 执行任务),最常用的是 interval 或 intervalRange,配合 flatMap / switchMap 去执行业务逻辑。

下面按常见场景给你几种实现方式。


一、固定时间间隔轮询(最常见)

示例:每 3 秒请求一次接口

Disposable disposable = Observable
        .interval(0, 3, TimeUnit.SECONDS)
        .flatMap(t -> apiService.getData()) // 网络请求
        .subscribe(
                result -> {
                    // 成功
                },
                throwable -> {
                    // 错误
                }
        );

说明:

  • 0:首次延迟(0 表示立即执行)
  • 3:轮询间隔
  • flatMap:每个 tick 触发一次任务

二、使用 switchMap(推荐,避免任务堆积)

如果任务执行时间可能超过轮询间隔,用 switchMap 更安全:

Observable.interval(0, 3, TimeUnit.SECONDS)
        .switchMap(t -> apiService.getData())
        .subscribe(
                result -> {},
                throwable -> {}
        );

✅ 特点:

  • 新任务开始时会取消上一个未完成的任务
  • 非常适合网络轮询

三、只轮询 N 次(有限轮询)

Observable.intervalRange(0, 5, 0, 3, TimeUnit.SECONDS)
        .flatMap(t -> apiService.getData())
        .subscribe(
                result -> {},
                throwable -> {}
        );
  • 从 0 开始
  • 总共 5 次
  • 每 3 秒一次

四、条件停止轮询(如成功即停止)

Observable.interval(0, 3, TimeUnit.SECONDS)
        .flatMap(t -> apiService.getData())
        .takeUntil(result -> result.isSuccess())
        .subscribe(
                result -> {},
                throwable -> {}
        );

✅ 满足条件后自动停止


五、RxJava2 / RxJava3 注意点

1️⃣ 必须在 IO 线程执行

Observable.interval(0, 3, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.io())
        .flatMap(t -> apiService.getData())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...)

2️⃣ 及时释放(防止内存泄漏)

@Override
protected void onDestroy() {
    if (disposable != null && !disposable.isDisposed()) {
        disposable.dispose();
    }
}

六、总结推荐方案

场景 推荐方式
普通轮询 interval + switchMap
有限次数 intervalRange
条件停止 takeUntil
网络请求 subscribeOn(Schedulers.io())

如果你用的是 RxJava + Retrofit + Android,或者想要 Kotlin + RxJava 示例,我可以直接给你完整代码。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手