2017-09-27 14 views
0

5秒以内にテキストを入力しないとTimeoutExceptionが発生しません。以下のコードメソッドはgetMsg()を呼び出し、テキスト入力を待ちます。私は 'timeout(5、TimeUnit.SECONDS)'を入力して5秒間だけ待つようにしました。ユーザーが5秒以内にmsgと入力しなかった場合のタイムアウトエラーを表示したい。rxJavaタイムアウトユーティリティを使用するとTimeoutExceptionが発生しない

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

答えて

3

getMsg()は、RxJavaに入る前に実行されます。 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..."); 
} 

を更新。私はそれを得た

Observable.fromCallable(() -> getMsg()) 
      .subscribeOn(Schedulers.io())    // <---------------------- 
      .timeout(5, TimeUnit.SECONDS) 
      .blockingSubscribe(System.out::println, 
        e -> e.printStackTrace()); 

System.out.println("End..."); 
+0

感謝を:代替は、データまたは終了を待つことsubscribeOn、可能なblockingSubscribeを使用することです。私はちょうど()静的な値で動作すると思うか、それは単に()メソッドを呼び出す前に評価する必要があります文です。 –

+0

タイムアウト例外が発生した場合にプログラムを終了しますが、現在のタイムアウト例外が発生しても実行中です。プログラムの実行を終了する方法を提案してください。 –

+0

RxJavaの範囲外のJavaのメインスレッドでブロッキングが発生するため、バックグラウンドスレッドでgetMsg()を実行する必要があります。それに応じて答えを更新しました。 – akarnokd

関連する問題