RxJava 是 ReactiveX 在 Java 平台上的实现,核心就是用操作符(Operators)把数据流(Observable / Flowable 等)进行转换、过滤、组合、调度。下面从基础概念 → 常用操作符 → 使用示例 → 实战建议来讲。
Observable<T>
.create / just / fromXxx // 创建
.map / filter / flatMap // 操作符
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
data -> {}, // onNext
error -> {}, // onError
() -> {} // onComplete
);
三大角色
just:直接发数据Observable.just("A", "B", "C")
.subscribe(s -> System.out.println(s));
fromIterable:集合转流Observable.fromIterable(Arrays.asList(1, 2, 3))
.subscribe(System.out::println);
create:手动发射Observable.create(emitter -> {
emitter.onNext(1);
emitter.onNext(2);
emitter.onComplete();
});
map:1 → 1Observable.just("1", "2", "3")
.map(Integer::parseInt)
.subscribe(i -> System.out.println(i + 1));
flatMap:1 → 多(无序)Observable.just("user1", "user2")
.flatMap(user ->
Observable.just(user + "_data1", user + "_data2")
)
.subscribe(System.out::println);
concatMap:1 → 多(保序).flatMap → 可能乱序
.concatMap → 按顺序
filterObservable.range(1, 10)
.filter(x -> x % 2 == 0)
.subscribe(System.out::println);
take / skip.take(3) // 只取前3个
.skip(2) // 跳过前2个
distinct.distinct() // 去重
merge:合并(并发)Observable.merge(
Observable.just("A"),
Observable.just("B")
)
.subscribe(System.out::println);
zip:一对一组合Observable.zip(
Observable.just(1, 2),
Observable.just("A", "B"),
(num, str) -> num + str
).subscribe(System.out::println);
Observable.just(1)
.subscribeOn(Schedulers.io()) // 上游线程
.map(i -> i + 1)
.observeOn(AndroidSchedulers.mainThread()) // 下游线程
.subscribe(i -> updateUI(i));
常用 Scheduler
Schedulers.io():IO 操作Schedulers.computation():计算AndroidSchedulers.mainThread():UI(Android)api.getUser()
.subscribeOn(Schedulers.io())
.map(User::getName)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
name -> textView.setText(name),
throwable -> toast("error")
);
❌ 不切线程 → 主线程卡死
❌ flatMap 乱序误用
❌ 忘记 dispose()(内存泄漏)
✅ 推荐用 CompositeDisposable
CompositeDisposable disposable = new CompositeDisposable();
disposable.add(observable.subscribe());
disposable.clear();
map / flatMap / filter / just / subscribeOnzip / merge / switchMap如果你愿意,可以告诉我:
我可以直接给你对应场景的 RxJava 写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。