RxJava 是响应式编程在 Java / Android 上的经典实现,核心优势是异步流管理、线程切换、事件组合与背压。下面是一些最经典、最常见的使用场景,按“为什么用 RxJava”来分类说明。
场景:
在子线程发起网络请求,在主线程更新 UI。
Observable.fromCallable(() -> api.getUser())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
user -> updateUI(user),
throwable -> showError(throwable)
);
✅ 优点:
Thread / Handler场景:
同时请求用户信息和配置信息,都返回后再处理。
Observable<User> userObs = api.getUser();
Observable<Config> configObs = api.getConfig();
Observable.zip(userObs, configObs,
(user, config) -> new Result(user, config))
.subscribe(result -> show(result));
✅ 典型使用:
场景:
先登录,再拿 token 去请求数据。
api.login()
.flatMap(token -> api.getUserInfo(token))
.subscribe(user -> show(user));
✅ 替代嵌套回调:
login(new Callback() {
onSuccess(token) {
getUserInfo(token, new Callback() { ... });
}
});
场景:
用户输入搜索关键词,停止输入 300ms 后再请求。
RxTextView.textChanges(editText)
.debounce(300, TimeUnit.MILLISECONDS)
.flatMap(text -> api.search(text))
.subscribe(result -> show(result));
✅ 常用于:
场景:
跨页面通信。
// 发送
bus.post(new Msg("hello"));
// 接收
bus.toObservable(Msg.class)
.subscribe(msg -> handle(msg));
✅ 比 EventBus:
场景:
每隔 5 秒拉一次数据。
Observable.interval(0, 5, TimeUnit.SECONDS)
.flatMap(tick -> api.poll())
.subscribe(data -> update(data));
✅ 替代:
场景:
先展示缓存,再刷新网络数据。
Observable.concat(
cache.getUser().toObservable(),
api.getUser().toObservable()
).firstElement().subscribe(user -> show(user));
场景:
多个输入共同决定“提交按钮是否可用”。
Observable.combineLatest(
nameObs, passwordObs, codeObs,
(name, pwd, code) -> !name.isEmpty() && !pwd.isEmpty() && !code.isEmpty()
).subscribe(enabled -> button.setEnabled(enabled));
场景:
高频事件(传感器、直播弹幕)。
Flowable.create(emitter -> {
// 高速产生数据
}, BackpressureStrategy.DROP)
.onBackpressureDrop()
.subscribe(data -> handle(data));
场景:
UI 事件 → 状态流 → UI 渲染。
viewEvent
.switchMap(event -> viewModel.handle(event))
.subscribe(state -> render(state));
RxJava 最适合:异步 + 多数据源 + 流式变换 + 线程控制
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。