繁体   English   中英

RxJava 手动发出项目

[英]RxJava emit items manually

我是 RxJava 世界的新手。 我几天前就开始了,我正在尝试做一些非常具体的事情。

我想使用 RxJava 将一些事件从一个类传递到其他类。 我的发射器类做了一些工作,完成后我想将该事件通知给每个订阅的类。

另外,我不想丢失任何事件,所以如果发射器完成一个动作并通知订阅者但没有人使用该事件,它应该保留它。

我一直在寻找主题,因为我读到的是按需发射的好方法,但我找不到解决我的问题的方法,也许我可以按照他们在该链接中所说的方式尝试PublishSubject

请注意,PublishSubject 可能会在创建后立即开始发出项目(除非您已采取措施防止这种情况发生),因此存在在创建主题和观察者订阅它之间可能丢失一个或多个项目的风险。 如果您需要保证从源 Observable 交付所有项目,则需要使用 Create 形成该 Observable,以便您可以手动重新引入“冷” Observable 行为(在开始发出项目之前检查所有观察者是否已订阅) ),或者改用 ReplaySubject。

目前我有一个Observable ,它向每个新订阅发出完整的事件列表:

protected List<T> commands = new ArrayList<>();
Observable<T> observe = Observable.defer(() -> Observable.fromIterable(commands));

Disposable subscribe(Consumer<T> onNext, Consumer<Throwable> onError) {
    return observe.subscribe(onNext/*, onError*/);
}

但这与我想要的相差甚远。 正如我所说,我对 Rx 非常菜鸟,如果我找不到一种方法,我最终将使用ReplaySubject (完整的命令列表将在每次订阅时重复,但至少我永远不会丢失一个事件)。

编辑:

最后我把我的问题分成两部分。 对于手动发出项目,我使用PublishSubject

PublishSubject<T> actionSubject = PublishSubject.create();
actionSubject.subscribe(onceAction);
actionSubject.onNext(action);

您可能正在寻找一个BehaviorSubject ,它重播为每个新订阅者发出的最后一个值。

无论如何,您可以使用名为createWithSize(capacity)的工厂方法创建ReplaySubject来定义大小有界缓冲区,该缓冲区在溢出时丢弃最旧的项目。 还有一种方法可以创建具有类似行为的限时缓冲区。

这不是你要找的吗?

    Observable<Integer> observable = Observable.create((ObservableEmitter<Integer> e) -> {
        for (int i = 0; i < 10; i++) {
            e.onNext(i);
        }
        e.onComplete();
    });

    System.out.println("FIRST");
    observable
            .doOnComplete(() -> System.out.println("FIRST COMPLETE"))
            .subscribe(System.out::println);
    System.out.println("SECOND");
    observable
            .doOnComplete(() -> System.out.println("SECOND COMPLETE"))
            .subscribe(System.out::println);

输出:

FIRST
0
1
2
3
4
5
6
7
8
9
FIRST COMPLETE
SECOND
0
1
2
3
4
5
6
7
8
9
SECOND COMPLETE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM