Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava:OnNext Unsubscribe不起作用_Java_Jakarta Ee_Rx Java_Reactive_Rx Java2 - Fatal编程技术网

RxJava:OnNext Unsubscribe不起作用

RxJava:OnNext Unsubscribe不起作用,java,jakarta-ee,rx-java,reactive,rx-java2,Java,Jakarta Ee,Rx Java,Reactive,Rx Java2,我正在尝试在收到来自一个可观察者的第一个项目后取消订阅。这似乎不起作用。我做错了什么 public class ObservableAndSubscriber { public static void main(final String[] args) { final Observable<String> strObservable = Observable.create(s -> { while (true) {

我正在尝试在收到来自一个可观察者的第一个项目后取消订阅。这似乎不起作用。我做错了什么

    public class ObservableAndSubscriber {

    public static void main(final String[] args) {
        final Observable<String> strObservable = Observable.create(s -> {
            while (true) {
                s.onNext("Hello World!!");
            }
        });

        final Subscriber<String> strSubscriber = new Subscriber<String>() {

            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(final Throwable e) {
                e.printStackTrace();

            }

            @Override
            public void onNext(final String t) {
                System.out.println(t);
                this.unsubscribe();

            }
        };
        strObservable.subscribe(strSubscriber);
    }
}
公共类ObservableAndSubscriber{
公共静态void main(最终字符串[]args){
最终可观测频闪可观测=可观测。创建(s->{
while(true){
s、 onNext(“你好,世界!!”);
}
});
最终订户strSubscriber=新订户(){
@凌驾
未完成的公共无效(){
}
@凌驾
公共作废申报人(最终可丢弃e){
e、 printStackTrace();
}
@凌驾
public void onNext(最终字符串t){
系统输出打印ln(t);
这个。取消订阅();
}
};
strObservable.subscribe(strSubscriber);
}
}

结果似乎在无限循环中打印“Hello World”。

我在阅读Tomasz Nurkiewicz的书时做了这个例子。他后来有了一个类似的例子,并解释了我的代码有什么问题

无限循环是邪恶的!因为在我的可观察createlambda表达式中有一个,所以它将在我的主线程和subscribe块的上下文中无限期地执行。为了获得可观察的create lambda,请在不同的线程中执行,这意味着主线程永远不会被阻塞,subscribe()将完成。我要求订阅发生在IO线程上,这就成功了,这意味着无限循环发生在IO线程上,不会阻塞主线程

strObservable.subscribeOn(Schedulers.io()).subscribe(strSubscriber);

要使“取消订阅”生效,您需要检查循环中的订阅状态。否则,它将无限地消耗您的CPU

处理无限顺序的最简单方法是利用库提供的方法
Observable.generate()
Observable.fromIterable()
。他们会为你做适当的检查

还要确保在不同的线程上订阅和观察。否则,您将只为单个用户提供服务

你的例子是:

strObservable = Observable.generate(g -> g.onNext("Hello!"));
strObservable.subscribeOn(Schedulers.newThread()).subscribe(strSubscriber);

我认为这不会解决退票的问题。在
main()
的末尾添加
Thread.sleep(1000)
,以延迟程序终止并查看其运行情况。-相关讨论。