Rx java 使用rxJava超时实用程序时未获取TimeoutException
如果我在5秒内没有输入任何文本,我不会收到TimeoutException。下面的代码方法将调用getMsg()并等待文本输入。我添加了'timeout(5,TimeUnit.SECONDS)'来只等待输入5秒。我想显示超时错误,以防用户在5秒内没有输入msgRx java 使用rxJava超时实用程序时未获取TimeoutException,rx-java,Rx Java,如果我在5秒内没有输入任何文本,我不会收到TimeoutException。下面的代码方法将调用getMsg()并等待文本输入。我添加了'timeout(5,TimeUnit.SECONDS)'来只等待输入5秒。我想显示超时错误,以防用户在5秒内没有输入msg import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.concurren
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.TimeUnit;
import rx.Observable;
public class TestRx {
public static void main( String[] args ) throws IOException {
Observable.just( getMsg() )
.timeout( 5, TimeUnit.SECONDS )
.subscribe( System.out::println,
e -> e.printStackTrace() );
System.out.println( "End..." );
}
private static String getMsg() throws IOException {
BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) );
System.out.print( "Enter a msg:" );
String msg = reader.readLine();
return msg;
}
}
getMsg()
在进入RxJava之前执行just()
不会神奇地使括号中的代码以延迟的方式发生。您需要来自Callable的:
public static void main( String[] args ) {
Observable.fromCallable(() -> getMsg() )
.timeout( 5, TimeUnit.SECONDS )
.subscribe( System.out::println,
e -> e.printStackTrace() );
System.out.println( "End..." );
}
更新
阻塞发生在主线程上,在此设置中不会中断。另一种方法是使用subscribeOn
和可能的blockingSubscribe
等待数据或终止:
Observable.fromCallable( () -> getMsg() )
.subscribeOn(Schedulers.io()) // <----------------------
.timeout( 5, TimeUnit.SECONDS )
.blockingSubscribe( System.out::println,
e -> e.printStackTrace() );
System.out.println( "End..." );
Observable.fromCallable(()->getMsg())
.subscribeOn(Schedulers.io())//e.printStackTrace());
System.out.println(“结束…”);
getMsg()
在进入RxJava之前执行just()
不会神奇地使括号中的代码以延迟的方式发生。您需要来自Callable的:
public static void main( String[] args ) {
Observable.fromCallable(() -> getMsg() )
.timeout( 5, TimeUnit.SECONDS )
.subscribe( System.out::println,
e -> e.printStackTrace() );
System.out.println( "End..." );
}
更新
阻塞发生在主线程上,在此设置中不会中断。另一种方法是使用subscribeOn
和可能的blockingSubscribe
等待数据或终止:
Observable.fromCallable( () -> getMsg() )
.subscribeOn(Schedulers.io()) // <----------------------
.timeout( 5, TimeUnit.SECONDS )
.blockingSubscribe( System.out::println,
e -> e.printStackTrace() );
System.out.println( "End..." );
Observable.fromCallable(()->getMsg())
.subscribeOn(Schedulers.io())//e.printStackTrace());
System.out.println(“结束…”);
谢谢,我收到了。我认为just()可以与静态值一起工作,或者如果它是在调用just()方法之前必须计算的语句,我希望程序在超时异常的情况下结束,但当前程序即使在超时错误之后仍在运行。请建议如何结束程序运行。由于阻塞发生在RxJava无法触及的Java主线程上,因此必须在后台线程上运行getMsg()。相应地更新了答案。谢谢,我知道了。我认为just()可以与静态值一起工作,或者如果它是在调用just()方法之前必须计算的语句,我希望程序在超时异常的情况下结束,但当前程序即使在超时错误之后仍在运行。请建议如何结束程序运行。由于阻塞发生在RxJava无法触及的Java主线程上,因此必须在后台线程上运行getMsg()。相应地更新了答案。