【问题标题】:delay and interval operators do not work properly延迟和间隔运算符无法正常工作
【发布时间】:2019-04-07 00:14:13
【问题描述】:

如下图,我正在创建Observables。我想以秒为单位等待特定的时间,如代码所示。因此我使用了延迟或间隔 操作员。我希望代码等待,即 5 秒,然后从观察者那里打印System.out.println

但发生的情况是,doOnNext 被执行并且代码永远不会更进一步。我的意思是即使在 5 秒过去之后,执行也会在 doOnNext 处停止。

代码

public static void main(String[] args) {
    Observable<List<Person>> observables = Observable.create(e-> {
        for(List<Person> p : Main.getPersons()) {
            e.onNext(p);
        }
        e.onComplete();
    });
     observables
    //.subscribeOn(Schedulers.newThread())//newThread
    .flatMap(p->Main.toObservable(p.get(0).getName()))
    .doOnNext(p-> System.out.println(p.length()) )
    .map(p->p+"..STRING")
    //.delay(5, TimeUnit.SECONDS)
    //.interval(0, 5, TimeUnit.SECONDS)
    .observeOn(Schedulers.io())
    .subscribe(new Observer() {
        @Override
        public void onComplete() {
            // TODO Auto-generated method stub
            System.out.println("onCompleted");
        }

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

        }

        @Override
        public void onNext(Object arg0) {
            // TODO Auto-generated method stub
            System.out.println("onNextFromObserver: " + arg0);
        }

        @Override
        public void onSubscribe(Disposable arg0) {
            // TODO Auto-generated method stub
        }
    });
}

private static <T> Observable<T> toObservable(T s) {
    return Observable.just(s);
}

private static List<List<Person>> getPersons() {
    return Arrays.asList(
            Arrays.asList(new Person("Sanna1", 59, "EGY"), new Person("Sanna2", 59, "EGY"), new Person("Sanna3", 59, "EGY")),
            Arrays.asList(new Person("Mohamed1", 59, "EGY"), new Person("Mohamed2", 59, "EGY")),
            Arrays.asList(new Person("Ahmed1", 44, "QTR"), new Person("Ahmed2", 44, "QTR"), new Person("Ahmed3", 44, "QTR")),
                    Arrays.asList(new Person("Fatma", 29, "KSA")),
                    Arrays.asList(new Person("Lobna", 24, "EGY"))
                    );
}

【问题讨论】:

  • 你为什么一遍又一遍地发布同样的问题?您必须在 main 方法中等待。将Thread.sleep(10000) 放在main() 方法的最后,这样Observable 就有机会运行。 RxJava 线程是守护线程,当应用程序线程退出main() 方法时停止。

标签: java observable rx-java2


【解决方案1】:

你必须在 main 方法中等待。将Thread.sleep(10000) 放在main() 方法的最后,这样Observable 就有机会运行。 RxJava 线程是守护线程,当应用程序线程退出main() 方法时停止。

public static void main(String[] args) {

    Observable.just("Hello World!", "Keep printing values!")
    .zipWith(Observable.interval(0, 5, TimeUnit.SECONDS), (a, b) -> a)
    .subscribe(v -> 
        System.out.println(Thread.currentThread() + ": " + v)
    );

    Thread.sleep(10000);  // <-----------------------------------

}

【讨论】:

  • 谢谢,但是在我尝试了你的代码之后.. just 运算符中的两个值同时显示...我想知道如何在每个发出的值之间添加延迟
  • 更新了答案,压缩间隔。如果您需要在不均匀到达的物品之间至少间隔 5 秒,请使用 spanout
  • 谢谢你能告诉我 a 和 b 是什么意思吗??
  • 它们是来自每个来源的值,主要 (a) 和区间 (b)。当两个来源都有一个值并且您想继续 (a) 时,Zip 会触发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
相关资源
最近更新 更多