使用rxJava超时实用程序时没有得到TimeoutException

时间:2017-09-27 13:28:37

标签: rx-java

如果我在5秒内没有输入任何文字,我没有收到TimeoutException。下面的代码方法将调用getMsg()并等待文本输入。我添加了#timeout; timeout(5,TimeUnit.SECONDS)'输入只等待5秒钟。如果用户在5秒内未输入msg,我想显示超时错误。

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;
   }
}

1 个答案:

答案 0 :(得分:5)

在进入RxJava之前,

getMsg()执行。 just()不会神奇地使其括号中的代码以延迟方式发生。您需要fromCallable

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..." );