rxjava Emitter

[复制链接]
发表于 2026-1-21 06:33:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
        在Android开发中,RxJava是一个盛行的库,用于处理惩罚异步和基于变乱的编程。RxJava 中的 Emitter 是一个接口(组件),用于发射 Observable 的变乱(onNext、onComplete、onError)。它是创建 Observable 时的核心组件,允许你手动控制数据流。根据差别场景,RxJava 提供了三种 Emitter:

  • SyncEmitter:同步发射变乱,必须依照 RxJava 的规则(如在 onComplete/onError 后不再发射变乱)。
  • AsyncEmitter:异步发射变乱,支持背压(Backpressure)。
  • SerializedEmitter:线程安全的发射器,主动处理惩罚多线程并发题目。
Emitter有几个方法,可以发射差别范例的变乱:

  •         onNext(Object): 发射一个非竣事变乱。
  •         onCompleted(): 发射一个完成变乱,体现变乱流竣事。
  •         onError(Throwable): 发射一个错误变乱,体现变乱流出现非常。
根本用法示例

下面是一个利用 Observable.create() 和 Emitter 创建自界说 Observable 的示例:
  1. import io.reactivex.rxjava3.core.Observable;
  2. import io.reactivex.rxjava3.core.Observer;
  3. import io.reactivex.rxjava3.disposables.Disposable;
  4. import io.reactivex.rxjava3.subjects.PublishSubject;
  5. public class EmitterExample {
  6.     public static void main(String[] args) {
  7.         // 创建一个 Observable,使用 Emitter 发射数据
  8.         Observable<Integer> source = Observable.create(emitter -> {
  9.             try {
  10.                 // 发射数据项
  11.                 emitter.onNext(1);
  12.                 emitter.onNext(2);
  13.                 emitter.onNext(3);
  14.                
  15.                 // 检查订阅状态,避免在取消订阅后继续发射
  16.                 if (!emitter.isDisposed()) {
  17.                     emitter.onComplete();
  18.                 }
  19.             } catch (Exception e) {
  20.                 // 发生错误时发射错误
  21.                 emitter.onError(e);
  22.             }
  23.         });
  24.         // 创建一个 Observer 来处理发射的事件
  25.         Observer<Integer> observer = new Observer<Integer>() {
  26.             @Override
  27.             public void onSubscribe(Disposable d) {
  28.                 System.out.println("onSubscribe");
  29.             }
  30.             @Override
  31.             public void onNext(Integer value) {
  32.                 System.out.println("onNext: " + value);
  33.             }
  34.             @Override
  35.             public void onError(Throwable e) {
  36.                 System.err.println("onError: " + e.getMessage());
  37.             }
  38.             @Override
  39.             public void onComplete() {
  40.                 System.out.println("onComplete");
  41.             }
  42.         };
  43.         // 订阅 Observable
  44.         source.subscribe(observer);
  45.     }
  46. }
复制代码
关键注意事项


  •         服从发射规则:

    • 必须在 onComplete 或 onError 后制止发射数据。
    • 不能同时调用 onComplete 和 onError。
    • 一旦调用 onComplete 或 onError,Observable 的生命周期竣事。
           
  •         处理惩罚背压:
            如果异步发射数据且鄙俚处理惩罚速率慢,需利用支持背压的操纵符(如 Flowable)或得当的战略(如 buffer、sample)。
  •         资源管理:
            在 onSubscribe 中返回的 Disposable 可用于取消订阅,防止内存走漏。比方:
    1. emitter.setCancellable(() -> {
    2.     // 释放资源的代码
    3. });
    复制代码
  •         线程安全:
            如果在多线程情况中利用 Emitter,发起利用 Observable.create() 共同 serialize() 操纵符确保线程安全。
Emitter 是 RxJava 中强大的工具,但需审慎利用以制止违反 RxJava 的规则导致难以调试的题目。
RxJava 的核心概念远不止 Emitter,它基于相应式编程范式,通过异步数据流将生产者和斲丧者解耦。以下是 RxJava 中其他关键的核心概念:
1. Observable / Flowable

脚色:数据的生产者,负责发失变乱序列。
区别:

  • Observable:不支持背压(Backpressure),实用于变乱数量较少或处理惩罚速率快的场景。
  • Flowable:支持背压,通过 Subscriber 控制数据流速,防止数据过载。
示例:
  1. // 创建 Observable(不支持背压)
  2. Observable.just("A", "B", "C")
  3.     .subscribe(System.out::println);
  4. // 创建 Flowable(支持背压)
  5. Flowable.range(1, 1000)
  6.     .subscribe(
  7.         System.out::println,  // onNext
  8.         Throwable::printStackTrace,  // onError
  9.         () -> System.out.println("Completed")  // onComplete
  10.     );
复制代码
2. Observer / Subscriber

脚色:数据的斲丧者,监听 Observable/Flowable 发出的变乱。
核心方法:

  • onNext(T value):吸收数据项。
  • onError(Throwable e):处理惩罚错误并制止流。
  • onComplete():流正常竣事时调用。
示例:
  1. Observer<String> observer = new Observer<String>() {
  2.     @Override
  3.     public void onSubscribe(Disposable d) {
  4.         System.out.println("订阅成功");
  5.     }
  6.     @Override
  7.     public void onNext(String value) {
  8.         System.out.println("接收到: " + value);
  9.     }
  10.     @Override
  11.     public void onError(Throwable e) {
  12.         e.printStackTrace();
  13.     }
  14.     @Override
  15.     public void onComplete() {
  16.         System.out.println("流已完成");
  17.     }
  18. };
  19. Observable.just("Hello", "World").subscribe(observer);
复制代码
3. Disposable

作用:管理订阅关系,允许在必要时取消订阅,防止内存走漏。
方法:

  • dispose():取消订阅。
  • isDisposed():查抄是否已取消。
示例:
  1. Disposable disposable = Observable.interval(1, TimeUnit.SECONDS)
  2.     .subscribe(System.out::println);
  3. // 5秒后取消订阅
  4. Thread.sleep(5000);
  5. disposable.dispose();
复制代码
4. Scheduler

作用:控制数据流的实行线程(如 IO、盘算、UI 线程)。
常用 Scheduler:

  • Schedulers.io():实用于 IO 麋集型操纵(如网络哀求)。
  • Schedulers.computation():实用于盘算麋集型操纵。
  • AndroidSchedulers.mainThread()(Android 平台):用于 UI 更新。
示例:
  1. Observable.just("A", "B", "C")
  2.     .subscribeOn(Schedulers.io())      // 指定 subscribe() 发生在 IO 线程
  3.     .observeOn(AndroidSchedulers.mainThread())  // 指定回调在主线程
  4.     .subscribe(System.out::println);
复制代码
5. 操纵符(Operators)

作用:转换、过滤、组合数据流,实现复杂的数据处理惩罚逻辑。
分类:

  • 创建操纵符:just()、from()、interval()、create()。
  • 转换操纵符:map()、flatMap()、buffer()、scan()。
  • 过滤操纵符:filter()、take()、distinct()、debounce()。
  • 组合操纵符:merge()、concat()、zip()、combineLatest()。
  • 错误处理惩罚:onErrorReturn()、retry()、catchError()。
示例:
  1. Observable.just(1, 2, 3, 4)
  2.     .map(num -> num * 10)         // 转换:每个元素乘以10
  3.     .filter(num -> num > 20)      // 过滤:只保留大于20的元素
  4.     .subscribe(System.out::println);  // 输出:30, 40
复制代码
6. Subject

特性:既是 Observable 又是 Observer,可同时发射和吸收变乱。
常见范例:

  • PublishSubject:只发射订阅后产生的变乱。
  • BehaviorSubject:发射订阅前的末了一个变乱 + 订阅后的全部变乱。
  • ReplaySubject:缓存全部变乱,订阅者会收到全部汗青数据。
  • AsyncSubject:只发射末了一个变乱(在 onComplete() 之后)。
示例:
  1. PublishSubject<String> subject = PublishSubject.create();
  2. subject.onNext("Event 1");  // 订阅前的事件不会被收到
  3. subject.subscribe(System.out::println);  // 订阅者开始监听
  4. subject.onNext("Event 2");  // 输出:Event 2
  5. subject.onNext("Event 3");  // 输出:Event 3
复制代码
7. 背压(Backpressure)

题目:当 Observable 发射速率 > Observer 处理惩罚速率时,大概导致内存溢出。
办理方案:

  • 利用 Flowable 更换 Observable。
  • 应用背压战略:

    • BUFFER:缓存全部变乱(大概 OOM)。
    • DROP:扬弃无法处理惩罚的变乱。
    • LATEST:只保存最新的变乱。
           
示例:
  1. Flowable.range(1, 1000)
  2.     .onBackpressureDrop()  // 丢弃无法处理的事件
  3.     .observeOn(Schedulers.io())
  4.     .subscribe(System.out::println);
复制代码
总结

RxJava 通过这些核心概念构建了强大的异步数据流处理惩罚本领,让代码更简便、可维护,并有效管理并发和资源。把握这些概念是利用 RxJava 的关键。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表