RxJava手动发出项目

时间:2017-03-04 20:06:08

标签: java rx-java observable

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

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

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

我一直在寻找Subjects,因为我读的是按要求发出的好方法,但我找不到解决我问题的方法,可能我会像他们说的那样试试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);

2 个答案:

答案 0 :(得分:0)

不是你在找什么?

    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

答案 1 :(得分:0)

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

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

相关问题