在 RxJava 中实现“轮询”(每隔一段时间请求一次接口 / 执行任务),最常用的是 interval 或 intervalRange,配合 flatMap / switchMap 去执行业务逻辑。
下面按常见场景给你几种实现方式。
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 -> {}
);
✅ 特点:
Observable.intervalRange(0, 5, 0, 3, TimeUnit.SECONDS)
.flatMap(t -> apiService.getData())
.subscribe(
result -> {},
throwable -> {}
);
Observable.interval(0, 3, TimeUnit.SECONDS)
.flatMap(t -> apiService.getData())
.takeUntil(result -> result.isSuccess())
.subscribe(
result -> {},
throwable -> {}
);
✅ 满足条件后自动停止
Observable.interval(0, 3, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.flatMap(t -> apiService.getData())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...)
@Override
protected void onDestroy() {
if (disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
}
| 场景 | 推荐方式 |
|---|---|
| 普通轮询 | interval + switchMap |
| 有限次数 | intervalRange |
| 条件停止 | takeUntil |
| 网络请求 | subscribeOn(Schedulers.io()) |
如果你用的是 RxJava + Retrofit + Android,或者想要 Kotlin + RxJava 示例,我可以直接给你完整代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。