Java Observable.create(SyncOnSubscribe.createStateless(…))抛出IllegalStateException:“异常”;onNext打了好几次电话&引用;
此示例方法返回数字1到9的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
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;
}
));