简体   繁体   English

RxJava 如何接受最多 5 个项目的任何订阅

[英]RxJava how to accept at most 5 items for any subscription

In RxJAVA we can replay old entries to new subscribers.在 RxJAVA 中,我们可以向新订阅者重播旧条目。 I would like to know if there is a mechanism that I can replay parametric number of entries to subscribers.我想知道是否有一种机制可以让我向订阅者重播参数数量的条目。

        Subscriber<String> firstSubscriber = new Subscriber<String>() {
            @Override
            public void onCompleted() {
                // TODO Auto-generated method stub
                
            }

            @Override
            public void onError(Throwable e) {
                // TODO Auto-generated method stub
                
            }

            @Override
            public void onNext(String t) {
                System.out.println("First Subscriber gets -> " + t);
            }
        };
        
        Subscriber<String> secondSubscriber = new Subscriber<String>() {
            @Override
            public void onCompleted() {
                // TODO Auto-generated method stub
                
            }

            @Override
            public void onError(Throwable e) {
                // TODO Auto-generated method stub
                
            }

            @Override
            public void onNext(String t) {
                System.out.println("Second Subscriber gets -> " + t);
            }
        };
        
        ReplaySubject<String> replaySubject = ReplaySubject.create();
        replaySubject.onNext("one");
        replaySubject.onNext("two");
        replaySubject.onNext("three");
        replaySubject.onNext("four");
        replaySubject.subscribe(firstSubscriber);
        replaySubject.onNext("five");
        replaySubject.onNext("six");
        replaySubject.subscribe(secondSubscriber);

Result:结果:

  • First Subscriber gets -> one第一个订阅者得到 -> 一个
  • First Subscriber gets -> two第一个订阅者得到 -> 两个
  • First Subscriber gets -> three第一个订阅者得到 -> 三个
  • First Subscriber gets -> four第一个订阅者得到 -> 四个
  • First Subscriber gets -> five第一个订阅者得到 -> 五
  • First Subscriber gets -> six第一个订阅者得到 -> 六个
  • Second Subscriber gets -> one第二个订阅者得到 -> 一个
  • Second Subscriber gets -> two第二个订阅者得到 -> 两个
  • Second Subscriber gets -> three第二个订阅者得到 -> 三
  • Second Subscriber gets -> four第二个订阅者得到 -> 四个
  • Second Subscriber gets -> five第二个订阅者得到 -> 五
  • Second Subscriber gets -> six第二个订阅者得到 -> 六个

What I would like to do is getting parametric number of entries.我想做的是获取条目的参数数量。 For example firstSubscriber will get the latest 2 entries when it subscribe例如 firstSubscriber 订阅时将获得最新的 2 个条目

If you want fully dynamic way of limited replay, you could defer the subscription and check the ReplaySubject how many items it currently has, then skip those you don't want:如果你想要完全动态的有限重播方式,你可以推迟订阅并检查ReplaySubject当前有多少项目,然后跳过那些你不想要的:

public static <T> Observable<T> replayDynamicSize(ReplaySubject<T> subject, int n) {
    return Observable.defer(() -> {
         int s = Math.max(0, subject.size() - n);
         return skip > 0 ? subject.skip(s) : subject;
    });
}

ReplaySubject<String> replaySubject = ReplaySubject.create();

Observable<String> four = replayDynamicSize(replaySubject, 4);
Observable<String> two = replayDynamicSize(replaySubject, 2);

        replaySubject.onNext("one");
        replaySubject.onNext("two");
        replaySubject.onNext("three");
        replaySubject.onNext("four");

four.subscribe(firstSubscriber);

        replaySubject.onNext("five");
        replaySubject.onNext("six");

two.subscribe(secondSubscriber);

One consideration here is that ReplaySubject should be bounded by itself to not retain every possible value if you don't plan to replay more than some amount of values.这里的一个考虑因素是ReplaySubject应该受其自身的限制,如果您不打算重播超过一定数量的值,则不会保留所有可能的值。

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

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