Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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
Java Observable.create(SyncOnSubscribe.createStateless(…))抛出IllegalStateException:“异常”;onNext打了好几次电话&引用;_Java_Java 7_Rx Java - Fatal编程技术网

Java Observable.create(SyncOnSubscribe.createStateless(…))抛出IllegalStateException:“异常”;onNext打了好几次电话&引用;

Java Observable.create(SyncOnSubscribe.createStateless(…))抛出IllegalStateException:“异常”;onNext打了好几次电话&引用;,java,java-7,rx-java,Java,Java 7,Rx Java,此示例方法返回数字1到9的Observable: public class Provider { public static Observable<Integer> test() { return Observable.create(SyncOnSubscribe.createStateless(new Action1<Observer<? super Integer>>() { @Override

此示例方法返回数字1到9的
Observable

public class Provider {
    public static Observable<Integer> test() {
        return Observable.create(SyncOnSubscribe.createStateless(new Action1<Observer<? super Integer>>() {
            @Override
            public void call(Observer<? super Integer> observer) {
                for (int i = 1; i < 9; i++)
                    // when i == 2, throws IllegalStateException:
                    // "onNext called multiple times!":
                    observer.onNext(i);
            }
        }));
    }
}
公共类提供程序{
公共静态可观察测试(){
返回Observable.create(SyncOnSubscribe.createStateless)(新操作1为什么不使用,
或类似变体,而不是可观察到的
。是否创建


然而,对于你的回答:

如Javadoc中所述:

…此重载将创建一个“无状态”SyncOnSubscribe,该SyncOnSubscribe没有显式状态值。当下一个函数关闭其状态时,应使用此选项

这个Javadoc在这个问题上不是很清楚,可以在Javadoc中找到更多信息:

…向下游用户呼叫发出数据
observer.onNext(t)
。向错误条件呼叫发出信号
observer.onError(throwable)
或引发
异常
。向数据流呼叫发出结束信号
observer.onCompleted()
。此方法的实现必须遵循以下规则

  • 每次调用不得调用observer.onNext(t)
超过1次
  • 不能同时调用observer.onNext(t)
  • 调用此方法返回的值将作为下一次调用此方法的状态参数传入

    这意味着在回调操作中

    • onNext
      后面应紧跟
      onCompleted
      onError
    • 每个回调调用应该只有一个
      onNext
      调用
    这对于在并发环境中加强安全性(这就是为什么它被称为订阅上的同步)和背压是必要的

    可以在回调中考虑for循环:

    return Observable.create(SyncOnSubscribe.createStateless(
            new Action1<Observer<? super Integer>>() {
                int counter = 0;
    
                @Override
                public void call(Observer<? super Integer> observer) {
                    if (counter < 9) {
                        observer.onNext(counter++);
                    } else {
                        observer.onCompleted();
                    }
                }
    
            }));
    
    但是for循环仍然需要考虑,并且有必要调用
    onCompleted

    为什么不使用, 或类似变体,而不是可观察到的
    。是否创建


    然而,对于你的回答:

    如Javadoc中所述:

    …此重载将创建一个“无状态”SyncOnSubscribe,该SyncOnSubscribe没有显式状态值。当下一个函数关闭其状态时,应使用此选项

    这个Javadoc在这个问题上不是很清楚,可以在Javadoc中找到更多信息:

    …向下游用户呼叫发出数据
    observer.onNext(t)
    。向错误条件呼叫发出信号
    observer.onError(throwable)
    或引发
    异常
    。向数据流呼叫发出结束信号
    observer.onCompleted()
    。此方法的实现必须遵循以下规则

    • 每次调用不得调用observer.onNext(t)
    超过1次
  • 不能同时调用observer.onNext(t)
  • 调用此方法返回的值将作为下一次调用此方法的状态参数传入

    这意味着在回调操作中

    • onNext
      后面应紧跟
      onCompleted
      onError
    • 每个回调调用应该只有一个
      onNext
      调用
    这对于在并发环境中加强安全性(这就是为什么它被称为订阅上的同步)和背压是必要的

    可以在回调中考虑for循环:

    return Observable.create(SyncOnSubscribe.createStateless(
            new Action1<Observer<? super Integer>>() {
                int counter = 0;
    
                @Override
                public void call(Observer<? super Integer> observer) {
                    if (counter < 9) {
                        observer.onNext(counter++);
                    } else {
                        observer.onCompleted();
                    }
                }
    
            }));
    

    但是for循环仍然需要分解,并且必须调用
    onCompleted

    好的,明白了。但是我把我的问题简化了…我需要为每个
    循环嵌套
    ,比如:
    for(NetworkInterface intf:interfaces)List addrs=Collections.List(intf.getinetades());for(InetAddress addr:addrs){…observer.onNext(addr);…}
    我在这里主要尝试的是将
    getIPAddress
    方法从转换为
    RxJava
    :我需要一个初始化器部分。那么我如何处理这种情况呢?@Tar为什么不使用?类似于(伪代码)
    Observable.from(接口).flatMapIterable的东西(intf::getInetAddresses())
    好的,明白了。但是我把我的问题简单化了…我需要一个解决方案来嵌套每个
    循环的
    ,比如:
    for(NetworkInterface intf:interfaces)List addrs=Collections.List(intf.getInetAddresses());for(InetAddress addr:addrs){…observer.onNext(addr);…}
    我在这里主要尝试的是将
    getIPAddress
    方法从转换为
    RxJava
    :我需要一个初始化器部分。那么我如何处理这个问题呢?@Tar为什么不使用?类似于(伪代码)
    Observable.from(interfaces).flatmapterable(intf::getinetaddress())
    return Observable.create(SyncOnSubscribe.createStateful(
            () -> 0,
            (counter, observer) -> {
                if (counter < 9) {
                    observer.onNext(counter);
                } else {
                    observer.onCompleted();
                }
                return counter + 1;
            }
    ));